【发布时间】:2010-09-06 14:50:10
【问题描述】:
你如何计算两个城市之间的距离?
【问题讨论】:
标签: algorithm math trigonometry geography
你如何计算两个城市之间的距离?
【问题讨论】:
标签: algorithm math trigonometry geography
您找到城市的纬度/经度,然后对纬度/经度坐标使用距离估计算法。
【讨论】:
【讨论】:
你可以使用A*算法来找到这两个城市之间的最短路径,这样你就知道了距离。
【讨论】:
如果你需要一个代码示例,我想我有一个可以在家里挖出来,但就像之前的许多答案一样,你需要一个 long / lat db 来进行计算
【讨论】:
最好使用查找表来获得两个城市之间的距离。
这是有道理的,因为 * 计算距离 a 的公式计算量很大。 * 城市之间的距离不太可能改变。
因此,除非您需要非常具体(例如来自卫星或某些地形的地形图或地形算法或其他东西),否则您实际上应该将城市列表和它们之间的距离保存到表格中并根据需要进行查找.
【讨论】:
如果你在飞机上工作并且想要Euclidean distance“如乌鸦飞”:
// 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);
不需要三角函数!只是 Pythagorean theorem 和平方总是正的事实,所以你不需要 dx = abs(x1 - x0) 等来获得一个正数来传递给 sqrt()。
请注意,您可能可以在一行中执行此操作,并且编译器会可能将其简化为上面的等效代码:
dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));
【讨论】:
如果您谈论的是在真正的球形行星(如地球)上两个真实城市之间的最短距离,您需要great circle distance。
【讨论】:
如果您需要考虑地球的曲率,大圆距离就是您要寻找的。 The Wikipedia article 可能比我更好地解释了公式的工作原理,还有this aviation formulary page 对此进行了更详细的介绍。
虽然公式只是难题的第一部分,但如果您需要对任意城市进行这项工作,则需要一个位置数据库来获取纬度/经度。幸运的是,您可以从Geonames.org 免费获得这个,尽管有可用的商业数据库(询问谷歌)。因此,一般来说,查找您想要的两个城市,获取纬度/经度坐标并将它们代入公式,如 the Wikipedia Worked Example。
其他建议:
最后但并非最不重要的一点是,Joel 不久前写了一篇关于这个问题的文章,所以你去吧:New Feature: Job Search
【讨论】:
我最近在这方面做了很多工作。我发现 SQL2008 的新特性确实让这变得简单。我可以在不到一秒的时间内找到 100k 记录表的 Xkm 内的所有点......不太破旧。
与 vincenty 公式(椭球假设,地球是什么)相比,我测试中的大圆(球形假设)方法大约相差 2.5 英里。
真正的诀窍是获取经纬度..为此我使用的是 Google。
【讨论】:
@Jared - 对您的代码示例的小修正。第一个代码示例的最后一行应为:
dist = sqrt(dx*dx + dy*dy);
【讨论】:
在 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
【讨论】:
我同意,一旦您获得信息,如果它不会更改,请以某种方式存储它。 @Marko Tinto 感谢 T-SQL 示例。对于那些无法访问 SQL Server 或更喜欢其他方法的人:如果您需要高精度,请查看Wikipedia's entry on the Vincenty algorithm 了解更多信息。我相信有一个 js 实现,它(如果还没有的话)很容易移植到其他语言。此外,该页面底部有一个指向 geographicLib 的链接,据称它比 Vincenty 算法精确 1000 倍(如果您有这么好的数据,这可能很重要)。
您为什么要使用 Vincenty 方法之类的方法?因为地球不是一个完美的球体,这样的方法允许输入更准确的主轴和次轴来模拟地球。
【讨论】:
我使用distancy 如此简单干净
【讨论】:
您可以从 google map 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
【讨论】: