Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中大圆和等角线两点之间的经纬度距离_Python_Math_Geospatial_Great Circle - Fatal编程技术网

Python中大圆和等角线两点之间的经纬度距离

Python中大圆和等角线两点之间的经纬度距离,python,math,geospatial,great-circle,Python,Math,Geospatial,Great Circle,根据我的代码: from math import radians, cos, sin, asin, sqrt, atan2, degrees, log, tan, pi, fabs def _c(old): direction = {'N':1, 'S':-1, 'E': 1, 'W':-1} new = old new = new.split() new_dir = new.pop(0) new.extend([0,0,0]) x = (flo

根据我的代码:

from math import radians, cos, sin, asin, sqrt, atan2, degrees, log, tan, pi, fabs

def _c(old):
    direction = {'N':1, 'S':-1, 'E': 1, 'W':-1}
    new = old
    new = new.split()
    new_dir = new.pop(0)
    new.extend([0,0,0])
    x = (float(new[0])+float(new[1])/60.0+float(new[2])/3600.0) * direction[new_dir]
    return x

def distance_rhumb_lines(lon1, lat1, lon2, lat2):      
    tenEtwelfe = 1000000000000
    r = 3443.89849 # Radius of earth in NM.

    lon1, lat1, lon2, lat2 = map(radians, [_c(lon1), _c(lat1), _c(lon2), _c(lat2)])
    dlat = fabs(lat2 - lat1)
    dlon = fabs(lon2 - lon1) 

    if fabs(dlon) > pi:
            dlon = -(2*pi-dlon) if dlon>0 else (2*pi+dlon)

    x = log( tan(pi/4+lat2/2) / tan(pi/4+lat1/2) )
    q = dlat/dlon if fabs(x) > tenEtwelfe else cos(lat1)

    dist = sqrt(dlat*dlat + q*q*dlon*dlon) * r
    return dist

def distance_great_circle(lon1, lat1, lon2, lat2):
    lon1, lat1, lon2, lat2 = map(radians, [_c(lon1), _c(lat1), _c(lon2), _c(lat2)])
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = (sin(dlat / 2) * sin(dlat / 2) +
                cos(lat1) * cos(lat2) * 
                sin(dlon / 2) * sin(dlon / 2))
    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    r = 3443.89849 # Radius of earth in NM.
    return c * r

def eet(gs, dist):
    return 60.0 / gs * dist

dist = distance_great_circle(lon1=u'N 47 27 59.60',lat1=u'E 7 39 55.6',lon2=u'N 47 30 32',lat2=u'E 7 57 0')
dist2 = distance_rhumb_lines(lon1=u'N 47 27 59.60',lat1=u'E 7 39 55.6',lon2=u'N 47 30 32',lat2=u'E 7 57 0')

eet_min = eet(100, dist)

print "Dist Great Circle = %.1f / Dist Rhumb Line = %.1f  / EET = %.1f min" % (dist, dist2, eet_min)
我不确定这是否是一个比python更具体的数学问题。这是我的剪贴簿代码,用于根据lat/long坐标计算两个给定点之间的距离

我的代码似乎可以工作,但结果是大约5海里(海里1海里=1.8公里)太高了,因为根据我的物理地图,我的测量结果是大约12海里(我的代码显示17.3米)

可能是什么问题?我是否使用了错误的地球半径?我是否必须考虑我的物理地图在半径范围内的投影类型


现在,有很多图书馆在做这些事情,而且他们做得更好;)但是,在我扔掉代码并使用库之前,我想知道我的代码有什么问题。

请指定您使用的公式好吗?它有各种各样的计算方法,每种方法都有自己的精度,更重要的是,它有自己的计算方法。是哈弗森公式吗?顺便说一句,我使用的物理地图是基于兰伯特共形圆锥投影的。老实说,我从网上复制了这些公式。但我认为它们是哈弗森公式。我的初始post ist copy/past中的代码已准备就绪,代表了我代码的100%。该网站提供了一个更简单的实现,并提供了一个界面来获取坐标的距离,所有这些都是您需要编码和测试的。检查一下。它提供了Javascrip实现,但将其应用于Java并不太困难。同样来自同一个网站,关于计算精度的一个重要注意事项是:精度:由于地球不是一个球体,因此在使用球面几何体时存在小误差;地球实际上是大致椭球的[…]局部曲率半径,从6336公里(赤道子午线)到6399公里(极地)不等。6371 km是地球平均半径的公认值。这意味着,假设球面几何体穿过赤道的误差可能高达0.55%,尽管通常低于0.3%,这取决于纬度和旅行方向。