首页 文章

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

提问于
浏览
4

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

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

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

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

2 回答

  • 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
    
  • 0

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

相关问题