我正在寻找某个城市搜索地点的最佳解决方案。此外,我需要找到可能靠近的位置,因为有时我们无法在一个小城市找到位置,但距离5公里的地方可能是一个更大的城市,有一些位置。但它总是有不同的价值,所以我无法想象我怎么知道这个搜索的最大距离。
我有三张桌子:
countries
:
id|code|name
cities
:
id|lat|lng|southwestLat|southwestLng|northeastLat|northeastLng|countryId|name
locations
:
id|lat|lng|cityId|name
我有三个想法:
select * from locations where cityId = :myCityId
,不是灵活的解决方案,因为这5公里' cities.lat
和cities.lng
为中心,southwestLat - northeastLat
和southwestLng - northeastLng
作为直径或有和高度的椭圆或矩形的交点进行搜索,但是&#39 ; s也不是一个灵活的解决方案,因为我们可以有一些城市,但不会在这个范围内,否则这个范围可能包括不必要的城市此外,我可以添加一些距离来增加多边形/椭圆/矩形的大小。但是哪个距离?
您如何看待这个? 你有同样的情况吗? 你做了什么来解决它?
提前谢谢!
更新1:它与Whats the fastest way to lookup big tables for points within radius MySQL (latitude longitude)无关,因为有关半径快速搜索的问题,但我正在寻找最灵活搜索的解决方案由城市而不是半径。
答案 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)
我没有找到真正满足所有问题的答案。