按城市查找位置的最佳做法

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.latcities.lng 为中心、southwestLat - northeastLatsouthwestLng - 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】:

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

【讨论】:

以上是关于按城市查找位置的最佳做法的主要内容,如果未能解决你的问题,请参考以下文章

查找美国城市所在的美国县的最佳方法是啥?

查找 mongo 文档计数的最佳做法是啥?

如何按城市代码查找时区?

使用地理位置查找最近的城市

sql 按帐户名称查找智能路由(做法)

查找距离指定地点最近的城市