如何计算一个城市的邻近城市?

如何计算一个城市(地级市)的邻近城市?

我暂时想到的思路是把所有城市用地图API获取经纬度,用经纬度计算距离,取最近的5个城市。

如果不包含省会,再加上省会。

大佬们有没有什么思路,或者现成的方案?

阅读 4.7k
2 个回答

最直接的思路是取得所有城市的经纬度之后,用勾股定理的方式换算直接距离,但这会带来一个问题:上千甚至上万城市的经纬度之差先平方然后开根号,最后再比较并排序,会消耗大量CPU时间。

所以后来我们的做法是:以这个城市的经纬度为中心,然后在经度和纬度上各增加一个小的值,看有没有城市落在这个区间里,如果没有足够的话,再稍微扩大一下范围再查一次,直到有大于5个城市落在这个区间里,然后我们再在这一部分城市中进行计算排序就可以了,这样前期只需要用到简单的加减法,速度会比直接平方的情况快不少。这只是一个思路,仅供参考。

把城市的经纬度转成geohash,值越接近距离就越近,然后用取前面几位,比较相似度即可

例如:
成都市:wm6jb
绵阳市:wmd7n
都江堰:wm98m
德阳市:wmd1p
自贡市:wm4wb
达州市:wms3t
攀枝花:wk8r4
丽江市:whz2b
昆明市:wk3js
昭通市:wkcg8

geohash长度 Lat位数 Lng位数 Lat误差 Lng误差 km误差
1 2 3 ±23 ±23 ±2500
2 5 5 ± 2.8 ±5.6 ±630
3 7 8 ± 0.70 ± 0.7 ±78
4 10 10 ± 0.087 ± 0.18 ±20
5 12 13 ± 0.022 ± 0.022 ±2.4
6 15 15 ± 0.0027 ± 0.0055 ±0.61
7 17 18 ±0.00068 ±0.00068 ±0.076
8 20 20 ±0.000086 ±0.000172 ±0.01911
9 22 23 ±0.000021 ±0.000021 ±0.00478
10 25 25 ±0.00000268 ±0.00000536 ±0.0005971
11 27 28 ±0.00000067 ±0.00000067 ±0.0001492
12 30 30 ±0.00000008 ±0.00000017 ±0.0000186

关于 geohash 的原理可以参考

推荐问题
宣传栏