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

===============>>#1 票数:32 已采纳

如果您需要考虑地球的曲率,那么大圆距离就是您正在寻找的。 维基百科的文章可能会更好地解释公式如何比我更有效,并且还有这个航空公式页面 ,其中涵盖了更详细的内容。

这些公式只是拼图的第一部分,如果你需要让这个工作适用于任意城市,你需要一个位置数据库来获取纬度/经度。 幸运的是,你可以从Geonames.org免费获得这个,虽然有商业数据库可用(请谷歌)。 所以,一般来说,查看你想要的两个城市,得到纬度/长度的联合并将它们插入到公式中,如维基百科工作示例中所示

其他建议:

  • 对于完整的商业解决方案,有许多货运公司用来计算运费的PC Miler
  • 拨打谷歌地图(或其他)API。 如果您每天需要执行许多请求,请考虑在服务器上缓存结果。
  • 同样非常重要的是考虑为城市,郊区,城镇等建立等价数据库,如果您认为您需要对数据进行分组。 这变得非常复杂,您可能找不到适合您的问题的万能解决方案。

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

===============>>#2 票数:9

您使用Haversine公式

===============>>#3 票数:2

这在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 elipsoidal Earth模型的SRID

===============>>#4 票数:1

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

===============>>#5 票数:1

如果你在飞机上工作,你想要欧几里德距离 “像乌鸦一样”:

// 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

===============>>#6 票数:1

如果你在谈论真正的球形行星上的两个真实城市之间的最短距离,比如地球,你需要大圆距离

===============>>#7 票数:1

你可以从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

===============>>#8 票数:0

我使用distancy如此简单和干净

===============>>#9 票数:0

您可以找到城市的Lat / Lon,然后使用Lat / Lon坐标的距离估计算法。

===============>>#10 票数:0

如果你需要一个代码示例我认为我有一个我可以在家里挖掘,但像许多以前的答案一样,你需要一个long / lat db来进行计算

===============>>#11 票数:0

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

这是有道理的,因为*计算距离a的公式计算量很大。*城市之间的距离不太可能改变。

因此,除非您需要非常具体(例如来自卫星或某些地形算法或其他地形的地形映射),您应该只是将城市列表和它们之间的距离保存到表格中并根据需要进行查找。

===============>>#12 票数:0

最近我一直在做很多工作。 我发现SQL2008的新功能确实让这很容易。 我可以在亚秒级的时间内找到Xkm为100k记录表的所有点......不会太破旧。

我的测试中的大圆(球面假设)方法与vincenty公式(elipsoidal假设,这就是地球的假设)相比大约需要2.5英里。

真正的诀窍是获得lat和long ..因为我正在使用Google。

===============>>#13 票数:0

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

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

===============>>#14 票数:0

我同意,一旦你掌握了信息,如果它不会改变,那就以某种方式存储它。 @Marko Tinto感谢T-SQL示例。 对于那些无法访问SQL Server或更喜欢其他方法的人:如果您需要高精度,请查看Wikipedia在Vincenty算法上的条目以获取更多信息。 我相信有一个js实现,它会(如果还没有)很容易移植到其他语言。 此外,该页面的底部是一个指向geographicLib的链接,它声称比Vincenty算法准确1000倍(如果你有好的数据,那可能很重要)。

你为什么要用Vincenty方法? 因为地球不是一个完美的球体,所以这样的方法可以输入更准确的长轴和短轴来模拟地球。

  ask by Krishna Kumar translate from so

未解决问题?本站智能推荐:

13回复

如何找到两个地点的纬度和经度的距离?

我有一套纬度和经度的位置。 如何找到从一个位置到另一个位置的距离 ? 有配方吗?
3回复

如何计算从点到矩形最近点的距离?

我在2D坐标系中有一个与轴对齐的矩形,该矩形由左下角的点和右上角的点以及可能在矩形的内部或外部的点表示。 我想找到该点到矩形最近点的距离,而不管它是否在矩形内。 当然,我可以只编写一个具有9种不同结果的切换案例,但我希望有一个更优雅的解决方案。 另外,我发现这个问题(如多种解决方案这一个
9回复

计算序列的余弦值

我必须计算以下内容: totalN是一个很大的数字,所以我想以更有效的方式做到这一点。 有没有办法改善这个? 我怀疑有,因为,毕竟,我们知道cos(n)的结果是什么,对于n = 1..N,所以也许有一些定理允许我以更快的方式计算它。 我真的很感激任何提示。 提前致谢,
1回复

计算圆点

如图所示,我有一个大圆圈,周围有几个小圆圈 首先,我像这样绘制中间的小圆圈: cxBig是大圆圈的中心。 hDist是我希望每个小圆圈到大圆圈的距离。 因此,现在小圆环的中间点与大圆环平行。 现在,我想从大圆圈中绘制hDist从中小圆圈中绘制vDist (垂直距
2回复

计算圆点-步长?

我想计算一个圆圈中的所有点。 我已经知道我可以使用x = r * cos(theta) + x0 , y = r * sin(theta) + y0计算点-但是我想知道是否存在一种很好的方法来找到合适的theta步长关于我的像素画布(或对我来说是LCD)的分辨率和圆的半径。 这是我已经拥
12回复

计算圆中点的位置

目前我对此有一点空白。 我有一个问题,我需要计算中心点周围点的位置,假设它们距离中心和彼此都是等距的。 点的数量是可变的,所以它是DrawCirclePoints(int x)我确定有一个简单的解决方案,但对于我的生活,我只是看不到它:)
1回复

用不同的方式计算Pi

我知道两种在代码中计算pi的方法。 或 pi = 4.0 * atan(1.0) 要么 pi = acos(-1.0) 一个人对另一个人有什么好处? 我知道有些语言具有内置的pi表示形式,但这并不是在询问它们。 此外,还有其他计算pi的常用方法以及它们与其他方法的比
5回复

如何计算圆的圆周上的点?

下列功能如何以各种语言实现? 给定以下输入值,计算圆的(x,y)点: 半径 角度 来源(可选参数,如果语言支持)
1回复

如何计算两个约束段的旋转角度?

我有两个向量,Y轴是固定的,X轴可以旋转。 这些向量通过两个固定长度的段连接在一起。 给定两个向量之间的角度(82.74)和所有线段的长度,如何获得两个关节线段的角度(24.62和22.61)? 给出的是:向量的大小,以及X轴和OG之间的角度: 这是我的起点: angle
2回复

计算3D平面圆的最小半径

假设我们有N个3D卡形平面围绕中心原点盘旋,面向中间。 要计算这些平面的位置(相对于原点),我们使用以下内容: 这很好用。 但现在,让我们说,我们只想指定N ,并用它来计算Radius ,使每个平面的两侧几乎无法接触,但没有碰撞。 我们需要的是一种计算最小半径的方法。 我意识