按城市查找地点的最佳做法

时间:2016-08-18 11:39:24

标签: mysql google-maps geometry

我正在寻找某个城市搜索地点的最佳解决方案。此外,我需要找到可能靠近的位置,因为有时我们无法在一个小城市找到位置,但距离5公里的地方可能是一个更大的城市,有一些位置。但它总是有不同的价值,所以我无法想象我怎么知道这个搜索的最大距离。

我有三张桌子:

countries

id|code|name

cities

id|lat|lng|southwestLat|southwestLng|northeastLat|northeastLng|countryId|name

locations

id|lat|lng|cityId|name

我有三个想法:

  1. select * from locations where cityId = :myCityId,不是灵活的解决方案,因为这5公里'
  2. 使用以cities.latcities.lng为中心,southwestLat - northeastLatsouthwestLng - northeastLng作为直径或有和高度的椭圆或矩形的交点进行搜索,但是&#39 ; s也不是一个灵活的解决方案,因为我们可以有一些城市,但不会在这个范围内,否则这个范围可能包括不必要的城市
  3. 获取城市多边形(通过谷歌地图api等)并在城市中搜索,但它与变体1相同,效率较低。
  4. 此外,我可以添加一些距离来增加多边形/椭圆/矩形的大小。但是哪个距离?

    您如何看待这个? 你有同样的情况吗? 你做了什么来解决它?

    提前谢谢!

    更新1:它与Whats the fastest way to lookup big tables for points within radius MySQL (latitude longitude)无关,因为有关半径快速搜索的问题,但我正在寻找最灵活搜索的解决方案由城市而不是半径。

2 个答案:

答案 0 :(得分:0)

我有几种方法可以做到这一点,这取决于要求......

邻居表

这通常是最快的,因为您可以将其编入索引。如果您可以获取所有位置的数据以便为您提供相邻位置,则可以简单地将查询1)修改为:

select *
from neighbours n 
inner join locations l on l.cityId = n.neighbourId
where n.cityId = @cityId;

这样做的缺点是你需要定义所有邻居的腿部工作。

大圆距离

如果您想允许具有精确距离的位置,那么您需要查看great circle distance公式。这需要一段时间来计算,所以你可以选择以下两个选项之一:

1)使用纬度/经度差来查找附近的位置,然后计算绝对距离。请注意,一旦开始向北或向南移动太远,这将会偏斜,因为经度将在短距离内显着变化。 2)使用映射表来计算所有位置之间的距离。如果您需要用户定义的位置来查找距离,则无法使用此功能。

混合解决方案

上述两者的混合可以通过计算城市(或更多任意区域)之间的距离来工作。将所有位置分配到其中一个区域,然后仅计算距离您开始搜索区域一定距离内的位置的距离。

答案 1 :(得分:0)

我没有找到真正满足所有问题的答案。