Широта Долгота расстояние между двумя точками в виде большого круга и прямой линии в Python

Учитывая мой код:

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. Это мой код записки для расчета расстояния между двумя заданными точками на основе координат широты и долготы.

Кажется, мой код работает, но результат примерно на 5 нм (морские мили 1 нм = 1,8 км) слишком высок, так как результат, который я получаю из моих измерений, основанных на моей физической карте, где результат составляет около 12 нм (мой код показывает 17,3 нм).

В чем может быть проблема? Я использую неправильный радиус земли? Должен ли я касаться типа проекции моей физической карты в радиусе?

Я сейчас, есть библиотеки, которые делают это, и они делают это лучше;) Но я хочу знать, в чем проблема с моим кодом, прежде чем я выброшу его и использую библиотеку.

0 ответов

Другие вопросы по тегам