在mysql中有效地存储地理位置

时间:2011-07-12 16:59:52

标签: mysql indexing geolocation

现在我将long和lat存储为DB中的两个十进制索引字段 我想知道(没有安装任何bizzare引擎)如果有一个有效的方法来做到这一点,所以索引也将帮助我计算距离。示例查询将是

  

从长X lat Y中获取10M无线电中的所有位置

2 个答案:

答案 0 :(得分:0)

您想要查找空间索引或空间填充曲线。 A si将2d复杂度降低到1d复杂度。它看起来像四叉树,有点像分形。如果你不介意形状和精确搜索你想要删除harvesine formule,因为你可以只搜索四叉树拼贴。当然你需要mercantor投影。这是迄今为止最快的方法。我用希尔伯特曲线大量使用它。你想找尼克的希尔伯特曲线空间索引四叉树博客。

答案 1 :(得分:-1)

使用float数据类型表示纬度和经度。任何更高精度的东西都很可能过度工程化。

除非您的结果需要精确到小于一米左右,否则float数据类型对于您要执行的操作具有精确的PLENTY。如果你的分辨率低于一米,你需要找出像Universal Transverse Mercator和Lambert这样的投影(球到平面)。

当你开始进行计算时,请记住,纬度(北 - 南)的一分钟(六分之一度)变化是一海里。

这是mySql人员在进行此搜索时的精彩演示。

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

性能优化是对纬度,也可能是经度进行索引,然后进行这样的搜索(正radius

where loctable.lat >=  (mylat-radius)
  and loctable.lat <=  (mylat+radius)
  and loctable.long >= (mylong-radius)
  and loctable.long <= (mylong+radius)
  and haversine_distance(mylat, mylong, loctable.lat, loctable.long) <= radius

这将搜索边界框。该边界框的纬度尺寸合适,经度可能太大(除非你在赤道附近)。但如果盒子太大,那就没关系了,因为最后一行没有任何额外的匹配。