现在我将long和lat存储为DB中的两个十进制索引字段 我想知道(没有安装任何bizzare引擎)如果有一个有效的方法来做到这一点,所以索引也将帮助我计算距离。示例查询将是
从长X lat Y中获取10M无线电中的所有位置
答案 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
这将搜索边界框。该边界框的纬度尺寸合适,经度可能太大(除非你在赤道附近)。但如果盒子太大,那就没关系了,因为最后一行没有任何额外的匹配。