【问题标题】:Display in range addresses within x miles of a geo location with google maps使用谷歌地图显示地理位置 x 英里范围内的地址
【发布时间】:2010-10-14 10:53:33
【问题描述】:

在我的数据库中,我有一个地点列表,每个地点都有街道名称和号码、邮政编码、城市和县。其中一些具有纬度和经度位置。

例如,我有市中心的地理位置。我想在谷歌地图上只显示距离市中心 X 英里范围内的地点。

如果这需要我的每个工作地点的地理位置,我也许可以设置一个脚本来使用 google maps api 使用地理编码来获取我所有地点的地理位置并使用 lat/ 更新数据库液化天然气然后我将拥有一个充满经纬度位置的数据库。

一旦所有地方都有 lat/lng 那么也许 mysql 可以返回范围内的地址?

【问题讨论】:

标签: php javascript mysql google-maps


【解决方案1】:

一旦你有 lat / long 数据,这并不难,如果有人给你 mySQL 格式的大圆距离公式。

@maggie 提供了很好的参考。 How to efficiently find the closest locations nearby a given location

索引策略:请记住,一分钟的纬度(1/60 度)是一海里,或全世界的 1.1515 法定英里(大约)。因此,索引您的纬度列并像这样进行搜索。 (如果您在世界上使用公里的地方,您可以转换;对于以旧英国帝国为中心的答案感到抱歉,但他们确实定义了海里。)

WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
  AND (the big distance formula) <= myradius

这将为您提供体面的数据库索引和相当准确的距离圈。

一个额外的改进:您也可以索引经度。问题是地面距离与经度没有直接关系。在赤道,它是每分钟一海里,但它变得更小,在两极有奇点。因此,您可以在 WHERE 中添加另一个术语。它给出了正确的结果,但不如纬度索引那么有选择性。但它仍然有助于索引查找,特别是如果您有很多行要筛选。所以你得到:

WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
  AND mylon BETWEEN column.lon-(myradius*1.1515) AND column.lon+(myradius*1.1515)
  AND (the big distance formula) < myradius

【讨论】:

    【解决方案2】:

    您很可能希望使用空间填充曲线或空间索引将 2D 问题简化为 1D 问题。例如,您可以将纬度/经度对与 z 曲线或希尔伯特曲线组合。我为自己使用希尔伯特曲线来搜索邮政编码。您可以在 phpclasses.org (hilbert-curve) 找到我的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多