私のコードを考えると:
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よりも数学固有の質問であるかどうかはわかりません。これは、緯度/経度座標に基づいて、指定された 2 点間の距離を計算するスクラップブック コードです。
私のコードは機能しているように見えますが、結果が約 12nm (私のコードは 17.3nm を示しています) である私の物理マップに基づいて測定した結果として、結果は約 5nm (海里 1nm = 1.8km) 高すぎます。
問題は何ですか?間違った地球半径を使用していませんか? 物理地図の射影タイプを半径で考慮する必要はありますか?
私は今、このようなことをしているライブラリがあり、彼らはそれをよりうまくやっています;)しかし、コードを捨ててライブラリを使用する前に、コードの問題を知りたいです。