按城市查找位置的最佳做法
Posted
技术标签:
【中文标题】按城市查找位置的最佳做法【英文标题】:Best practice to find locations by city 【发布时间】:2016-08-18 11:39:24 【问题描述】:我正在寻找按某个城市搜索位置的最佳解决方案。我还需要找到可能在附近的位置,因为有时我们在小城市找不到位置,但 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
为直径或高度的矩形的交点进行搜索,但这也不是一个灵活的解决方案,因为我们可以有附近的一些城市,但不在此范围内,否则此范围可能包括不必要的城市
获取城市多边形(通过 google maps api 等)并仅在城市中搜索,但它与变体 1 相同且效率较低。
我还可以添加一些距离来增加多边形/椭圆/矩形的大小。但距离是多少?
您对此有何看法? 你有同样的情况吗? 你做了什么来解决它?
提前谢谢你!
更新 1: 它与 Whats the fastest way to lookup big tables for points within radius mysql (latitude longitude) 无关,因为这个关于按半径快速搜索的问题,但我正在寻找按城市而不是某个半径进行最佳灵活搜索的解决方案.
【问题讨论】:
Whats the fastest way to lookup big tables for points within radius MySQL (latitude longitude)的可能重复 @e4c5 只是在半径范围内搜索,我的问题更复杂,并不强迫我选择这个解决方案 【参考方案1】:我有几种方法可以做到这一点,这取决于要求...
邻居表
这通常是您可以索引它的最快速度。如果您可以获得所有位置的数据以提供相邻位置,您可以简单地将查询 1) 修改为:
select *
from neighbours n
inner join locations l on l.cityId = n.neighbourId
where n.cityId = @cityId;
这样做的缺点是您需要定义所有邻居的腿部工作。
大圆距离
如果您想允许具有精确距离的位置,那么您需要查看great circle distance 公式。不过,这需要一些时间来计算,因此您可以选择以下两个选项之一:
1) 使用纬度/经度差找到附近的位置,然后计算绝对距离。请注意,一旦您开始向北或向南移动太远,这将会出现偏差,因为短距离的经度会发生显着变化。 2)使用映射表计算所有位置之间的距离。如果您有需要查找距离的用户定义位置,这将不起作用。
混合解决方案
以上两者的混合可以通过计算城市(或更多任意区域)之间的距离来工作。将所有位置分配给这些区域之一,然后仅计算距您开始的搜索区域一定距离内的位置的距离。
【讨论】:
最后一种方式做起来很有意思。但是我在哪里可以找到有关邻居的信息,因为手动填写的信息太多。【参考方案2】:我没有找到真正满足所有问题的答案。
【讨论】:
以上是关于按城市查找位置的最佳做法的主要内容,如果未能解决你的问题,请参考以下文章