【问题标题】:store geolocation efficiently in mysql在mysql中有效地存储地理位置
【发布时间】:2011-10-03 19:52:14
【问题描述】:

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

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

【问题讨论】:

标签: mysql indexing geolocation


【解决方案1】:

对纬度和经度使用浮点数据类型。任何更高精度的东西很可能都是过度设计的。

除非您的结果需要精确到不到一米左右,否则浮点数据类型对于您要执行的操作具有很高的精度。如果您的工作分辨率低于一米,您将需要了解投影(球面到平面),例如 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

这会搜索一个边界框。该边界框的纬度尺寸合适,经度可能太大(除非您在赤道附近)。但是如果盒子太大也没关系,因为最后一行去掉了任何额外的匹配项。

【讨论】:

  • 如果浮点类型是 32 位,那么它将没有足够的有效数字来准确定位亚英尺精度的纬度/经度。您至少需要 10 个 sig 无花果(考虑经度 -179.1234567),您可以通过双倍获得。要提高位置的准确性,只需添加更多小数位。 UTM 和其他预测不会使您在描述位置时获得任何准确性。
  • 对不起,这不正确。半正弦大圆距离公式假设一个球形地球。地球不是完全球形的,测量员的预测对此是正确的。 haversine 公式适用于商店查找器和飞机燃料计算。但是如果你用它来布置你的停车场,你会得到水坑。
  • 您混淆了几个问题。 Haversine 是关于距离而不是精度。测量员使用仪器(经纬仪)精确确定纬度/经度位置。您可以使用 lat/lon 精确到纳米级来描述位置,但是您的测量仪器可能不那么准确。
  • 试试这个:使用 IEEE 754 浮点数,您可以获得 7 个有效数字 (en.wikipedia.org/wiki/Floating_point)。现在转到谷歌地球并在 39.0/-123.4567 处设置一个标记。现在在 39.0/-123.4568 处设置另一个标记并使用标尺工具测量距离。我得到大约 8.5 米。这意味着如果您为 CA lat/lon 数据库使用浮点类型,它只能描述 8.5 米的位置。因此,如果您需要更高的准确性,请使用双精度。
【解决方案2】:

您想查找空间索引或空间填充曲线。一个 si 将 2d 复杂度降低到 1d 复杂度。它看起来像四叉树,有点像分形。如果您不介意形状和精确搜索,您想删除 harvesine 公式,因为您可以只搜索四叉树图块。当然,您需要 Mercantor 投影。这是迄今为止最快的方法。我经常将它与希尔伯特曲线一起使用。您想查找 Nick 的希尔伯特曲线空间索引四叉树博客。

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2012-08-11
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多