搜索范围纬度/经度坐标


Search for range Latitude/Longitude coordinates

这个脚本可以工作,但我相信有更好的方法来实现这一点。我已经尝试过使用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 ."'  "; 

你所做的一些版本是正确的,但我认为你可能想要使用实际的几何类型,特别是如果你是在MyISAM上,可以创建一个R-Tree空间索引。您可以使用任何支持类型的列(例如point, polygon),或通用的geometry类型:

mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)

然后用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)

然后你可以做你的查询(即附近),针对最小边界矩形的线串终止点point1 = longitude - increment, lon - increment, y = longitude + increment, latitude + increment,即这里的+- 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)

这将比在一堆表示经度和纬度的浮点数上做算术要好得多。顺便说一句,在旧金山的位置,以下常量可以很好地转换经度和纬度之间的公里和度数(例如,如果你想要圣克鲁兹的干净方形地图):

lonf 0.01132221938
latf 0.0090215040

也就是说,(x +- 2*lonf, y +- 2*latf)给出了你感兴趣点周围2km宽的男孩的相关$lat_floor等值。

我看不出你这样做有什么不妥,但是这样做可能会更简洁一些:

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

PostGIS是PostgreSQL数据库的附加组件,用于管理地理数据。它有一个距离函数:http://postgis.refractions.net/documentation/manual-1.3/ch06.html#id2574517

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