如何计算两个城市之间的距离?

有帮助吗?

解决方案

如果您需要考虑地球的曲率,那么您需要的是大圆距离。 维基百科文章 可能比我更好地解释了公式的工作原理,而且还有 此航空处方页面 这涵盖了更详细的内容。

这些公式只是难题的第一部分,如果您需要使其适用于任意城市,您将需要一个位置数据库来获取纬度/经度。幸运的是,您可以免费获得这个 地名网, ,尽管有商业数据库可用(询问谷歌)。因此,一般来说,查找您想要的两个城市,获取纬度/经度坐标并将它们代入公式中,如下所示 维基百科的工作示例.

其他建议:

  • 对于完整的商业解决方案,有 电脑米勒 这是许多卡车运输公司用于计算运输率的。
  • 调用 Google 地图(或其他)API。如果您每天需要执行许多请求,请考虑在服务器上缓存结果。
  • 很重要 是考虑为城市、郊区、城镇等建立一个等价数据库。如果您认为需要对数据进行分组。但这变得非常复杂,您可能找不到针对您的问题的一刀切的解决方案。

最后但并非最不重要的一点是,乔尔不久前写了一篇关于这个问题的文章,所以这里是: 新功能:求职

其他提示

您使用 半正矢公式.

使用 SQL Server 2008 中的地理类型可以很容易地做到这一点。

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm

4326 是 WGS84 椭球地球模型的 SRID

你可以使用 A* 算法找到这两个城市之间的最短路径,这样你就可以得到距离。

如果您正在谈论一个真实的球形行星(例如地球)上两个真实城市之间的最短距离,您想要 大圆距离.

如果您在飞机上工作并且想要 欧氏距离 “如乌鸦飞翔”:

// Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1]
dx = x1 - x0;
dy = y1 - y0;
dist = sqrt(dx*dx + dy*y);

不需要三角函数!只是 勾股定理 事实上,平方总是正数,所以你不需要 dx = abs(x1 - x0) 等。获取一个正数传递给 sqrt()。

请注意,您可能可以在一行中完成此操作,编译器会 大概 将其简化为上面的等效代码:

dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));

[1] http://en.wikipedia.org/wiki/Smoot

您可以从 google 地图 api 获取两个城市之间的距离。这是它在 Python 中的实现

#!/usr/bin/python
import requests
from sys import argv 
def get_distance(origin,destination):
    gmap='http://maps.googleapis.com/maps/api/distancematrix/json'
    payload={"origins":origin,"destinations":destination,"sensor":'false' }
    try:
        a=requests.get(gmap,params=payload)
        data = a.json()
        origin = str(data['origin_addresses'][0])
        destination= str(data['destination_addresses'][0])
        distance = data['rows'][0]['elements'][0]['distance']['text']
        return distance,origin,destination
    except Exception,e:
        print "The %s or %destination does not exists :(" %(origin,destination)
        exit()

if __name__=="__main__":
    if len(argv)<3:
        print "sorry Check the format"
    else:
        origin=argv[1]
        destination=argv[2]
        distance,origin,destination=get_distance(origin,destination)
        print "%s ---> %s    :   %s" %(origin,destination,distance)

示例链接: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

您找到城市的纬度/经度,然后使用纬度/经度坐标的距离估计算法。

如果您需要一个代码示例,我想我有一个可以在家里挖掘的代码示例,但是像前面的许多答案一样,您需要一个长/纬度数据库来进行计算

最好使用查找表来获取两个城市之间的距离。

这是有道理的,因为 *计算距离AI的公式在计算上很密集。* 城市之间的距离不太可能改变。

因此,除非您的需求非常具体(例如来自卫星的地形图或某些地形算法或其他东西),否则您实际上应该将城市列表及其之间的距离保存到表格中并根据需要进行查找。

我最近在这方面做了很多工作。我发现 SQL2008 的新功能确实使这一切变得简单。我可以在亚秒级的时间内找到 100k 记录表的 Xkm 范围内的所有点...还不错。

我测试中的大圆(球形假设)方法与文森蒂公式(椭圆体假设,即地球)相比相差约 2.5 英里。

真正的技巧是获取纬度和经度……为此我正在使用谷歌。

@Jared - 对您的代码示例进行小幅更正。第一个代码示例的最后一行应为:

dist = sqrt(dx*dx + dy*dy);

我同意,一旦你掌握了信息,如果它不会改变,就以某种方式存储它。@Marko Tinto 感谢您提供 T-SQL 示例。对于那些无法访问 SQL Server 或更喜欢其他方法的人:如果您需要高精度,请查看 维基百科关于 Vincenty 算法的条目 了解更多信息。我相信有一个 js 实现,它可以(如果还没有的话)轻松移植到其他语言。此外,该页面底部有一个链接 地理库, ,据称比 Vincenty 算法准确 1000 倍(如果你有那么好的数据,它可能很重要)。

为什么要使用 Vincenty 方法之类的方法?因为地球不是一个完美的球体,所以类似的方法允许输入更准确的长轴和短轴来对地球进行建模。

我用 距离 如此简单干净

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top