gpt4 book ai didi

mysql - 按城市查找位置的最佳实践

转载 作者:行者123 更新时间:2023-11-29 20:31:34 25 4
gpt4 key购买 nike

我正在寻找按某个城市搜索位置的最佳解决方案。我还需要找到可能很近的位置,因为有时我们在小城市找不到位置,但 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.lat 的交集进行搜索和cities.lng为中心,southwestLat - northeastLatsouthwestLng - northeastLng作为直径或高度,但这也不是一个灵活的解决方案,因为我们可以有一些城市在附近,但不在这个范围内,否则这个范围可能包括不必要的城市
  3. 获取城市多边形(通过谷歌地图 API 等)并仅在城市中搜索,但它与变体 1 相同,但效率较低。

我还可以添加一些距离来增加多边形/椭圆/矩形的大小。但距离是多少呢?

你对此有何看法?你有同样的案例吗?您采取了什么措施来解决这个问题?

提前谢谢您!

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

最佳答案

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

邻居表

这通常是最快的,因为您可以对其建立索引。如果您可以获得所有位置的数据来给出邻近位置,您可以简单地将查询 1) 修改为:

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

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

大圆距离

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

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

混合解决方案

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

关于mysql - 按城市查找位置的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39017271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com