搜索范围纬度/经度坐标

时间:2011-08-18 18:58:51

标签: 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 =  floatval($lng) - floatval($vicinity);

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

4 个答案:

答案 0 :(得分:3)

你正在做的某些版本是正确的,但我认为你可能想要使用实际的几何类型,特别是如果你在MyISAM上并且可以创建一个R-Tree空间索引。您可以拥有包含任何受支持类型的列(例如pointpolygon)或cat 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 =经度 - 增量,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)

这比在代表经度和纬度的一堆浮点数上进行算术运算要好得多。顺便说一下,在旧金山的位置,以下常数在公里和经度和纬度之间转换时非常有效(例如,如果你想要圣克鲁斯的干净方形地图):

lonf 0.01132221938
latf 0.0090215040

即,(x + - 2 * lonf,y + - 2 * latf)为您提供围绕您感兴趣点的2公里宽男孩的相关$lat_floor等值。

答案 1 :(得分:2)

我没有看到你做这件事的方式有什么问题,但这可能会更清洁:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您正在寻找harvesine公式的近似值,您可能希望使用空间索引或空间填充曲线。 sfc是四叉树和分形数据结构,将2d复杂度降低到1d复杂度。它是一条完整填充空间的曲线和一种巧妙的算法来细分地图。您还可以嵌套切片并累积一个四核,并使用标准的mysql字符串运算符在此键中搜索,而不是计算索引。例如,如果您有一个四键11111222233334444,您可以搜索1111 *以查找所有key =&gt;来自此节点以及其下方或右侧的位置对。