使用Google地图在地理位置的x英里范围内显示范围地址

时间:2010-10-14 10:53:33

标签: php javascript mysql google-maps

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

我有市中心的地理位置。我想在谷歌地图上只显示市中心X英里范围内的地方。

如果这需要我的每个地方工作的地理位置,我可以设置一个脚本使用谷歌地图api使用地理编码来获取我所有地方的地理位置并使用lat /更新数据库LNG。然后我会有一个完整的lat和long位置的数据库。

一旦所有的地方都有一个lat / lng,那么mysql可能会返回范围内的地址吗?

2 个答案:

答案 0 :(得分:2)

一旦你有纬度/经度数据,并且如果有人为你提供mySQL格式的大圆距离公式,这并不难。

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

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

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

答案 1 :(得分:0)

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

相关问题