位置的数据库过程

时间:2010-07-08 02:43:25

标签: mysql database geospatial spatial-query

我正在尝试存储GPS位置数据库并运行查询,查找给定半径内的点以及最近的点。我正在使用mysql,并一直在寻找空间扩展。我不确定我是否看到如何在位置半径查询中实际使用空间扩展来执行我正在寻找的内容。

所以这就是我对我的选择的想法:

  1. 将lat和long gps坐标存储为db中的float索引变量。当我得到一个点gps坐标和一个范围时,计算要查询的最大和最小纬度和长值,然后根据这些中的距离函数进行排序。

  2. 使用空间扩展。我不太肯定这会奏效。 Distance()函数未实现。使用空间索引需要找到一个边界框(可行)并调用MBRContains边界框函数来查找此边界框中的点。但是一个点的边界为零,因此MBRContains函数对点不起作用。

  3. 我不确定这样做的标准方法是什么(看起来似乎没有),并且非常感谢任何经验/想法/帮助决定的话。我目前正在使用mysql 5.13,我非常确定即使5.5 on也没有距离度量。

    另外 - 即使2.工作,哪一个会更快?请让我知道你的想法,特别是如果你确定/已经看到一些工作快速和大型查找!

    Mysql空间索引:http://dev.mysql.com/doc/refman/5.5/en/using-a-spatial-index.html

2 个答案:

答案 0 :(得分:1)

这样的东西应该能够获得坐标和任意点之间的距离,在本例中为“origin”。

SELECT 
place.name,
place.foo,
ROUND( SQRT(
   POW((69.1 * ({$origin->lat} - place.lat)), 2) 
 + POW((53.0 * ({$origin->lon} - place.lon)), 2)
), 1) AS distance
FROM place
ORDER BY distance ASC

希望有帮助...

答案 1 :(得分:0)

gps坐标的距离有多近?如果它们相对接近使得地球的曲率不成问题,您可以首先尝试使用线性距离查询,以查看其执行情况。但是,这确实需要全表扫描,如果点没有充分聚集,则可能无法产生准确的结果。此时,您需要转到边界框+大弧距计算。