Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 搜索范围纬度/经度坐标_Php_Mysql_Geolocation - Fatal编程技术网

Php 搜索范围纬度/经度坐标

Php 搜索范围纬度/经度坐标,php,mysql,geolocation,Php,Mysql,Geolocation,这个脚本很有效,但我相信有更好的方法来实现这一点。我已经尝试过使用MySQL gis功能来存储它们,任何其他建议都会有所帮助 $vicinity = .001; $lat_ceiling = floatval($lat) + floatval($vicinity); $lat_floor = floatval($lat) - floatval($vicinity); $lng_ceiling = floatval($lng) + floatval($vicinity); $lng_floor

这个脚本很有效,但我相信有更好的方法来实现这一点。我已经尝试过使用MySQL gis功能来存储它们,任何其他建议都会有所帮助

$vicinity = .001;

$lat_ceiling = floatval($lat) + floatval($vicinity);
$lat_floor =  floatval($lat) - floatval($vicinity);
$lng_ceiling = floatval($lng) + floatval($vicinity);
$lng_floor =  floatval($lng) - floatval($vicinity);

$query = "SELECT * FROM `geolocations` WHERE".
            "`latitude` <= '".$lat_ceiling."' AND `latitude` >= '". $lat_floor ."' AND `longitude` <= '".$lng_ceiling."' AND `longitude` >= '". $lng_floor ."'  "; 

我看不出你这样做有什么真正的问题,但这可能会更干净一些:

SELECT *
FROM `geolocations`
WHERE
    `latitude` BETWEEN $lat - $vicinity AND $lat + $vicinity
    AND
    `longitude` BETWEEN $lng - $vicinity AND $lng + $vicinity

是PostgreSQL数据库的附加组件,用于管理地理数据。它有一个距离函数:

如果要寻找哈维辛公式的近似值,可能需要使用空间索引或空间填充曲线。sfc是一种四叉树和类似分形的数据结构,它将二维复杂度降低到一维复杂度。这是一条完全填满空间的曲线,也是一个细分地图的聪明算法。除了计算索引,您还可以嵌套分片并累积一个四键,然后使用标准的mysql字符串运算符在该键中搜索。例如,如果您有一个四键11111 2222233334444,您可以搜索1111*以查找此节点及其下方或右侧的所有键=>位置对。

您所做的某些版本是正确的,但我认为您可能希望使用实际的几何体类型,尤其是在使用MyISAM并可以创建R树空间索引的情况下。可以具有任何受支持类型(即点、多边形或catchall几何图形类型)的列:

然后使用WKT语法进行查询和更新:

mysql> insert into spatial_table values (1, GeomFromText('POINT(1 1)'), GeomFromText('POLYGON((1 1, 2 2, 0 2, 1 1))'));
Query OK, 1 row affected (0.00 sec)

mysql> insert into spatial_table values (1, GeomFromText('POINT(10 10)'), GeomFromText('POLYGON((10 10, 20 20, 0 20, 10 10))') );
Query OK, 1 row affected (0.00 sec)
然后,您可以对终止点为1=经度-增量、lon-增量、y=经度+增量、纬度+增量的线字符串的最小边界矩形进行查询,即在此处以+-为1:

mysql> select * from spatial_table where MBRContains(GeomFromText('LINESTRING(9 9, 11 11)'), my_spots);
+------+---------------------------+-----------------------------------------------------------------------------------+
| id   | my_spots                  | my_polygons                                                                       |
+------+---------------------------+-----------------------------------------------------------------------------------+
|    1 |              $@      $@ |                    $@      $@      4@      4@              4@      $@      $@ |
+------+---------------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)
这将比在一组表示经度和纬度的浮点数上执行算术要好得多。顺便说一下,在旧金山的位置上,下面的常数对于Km和度经度和纬度之间的转换相当有效,如果你想要圣克鲁斯的干净方块图:

lonf 0.01132221938
latf 0.0090215040

也就是说,x+-2*lonf,y+-2*latf为您的兴趣点周围一个2公里宽的男孩提供相关的$lat_地板等值。

告诉我们此代码应该做什么。这对于小距离应该可以很好地工作。阅读会有帮助:我……尝试使用MySQL gis存储它们……任何其他建议都会有帮助您知道geo扩展是否更快吗然后用我的方法还是自己计算一个空间索引?什么是用于索引坐标的地理扩展?z曲线?hilbert曲线?R-树空间索引和mysql的快速课程澄清了很多。谢谢请你继续回答我的下一个问题好吗。MyISAM上的geo扩展是一个R-树,不确定是Hilbert R-树还是其他什么-但是如果你只是在InnoDB上添加了一个空间索引,它实际上会给你一个B-树,这对于查找单个点来说基本上是可以的,其他的就不多了。如果我想滚动我自己的地理索引,为了简单起见,我可能会使用某种geohash,我认为它的行为会像您的上一个示例一样。@bvmou:geohash是xkbd使用的众所周知的算法,它是某种z曲线。我可以演示如何使用Hilbert曲线和四键来获取不完整四键的所有位置。
lonf 0.01132221938
latf 0.0090215040