Python: вычислить отношение между двумя широтами - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь рассчитать отношение между двумя широтами / долготами.

У меня нет вопросов относительно функции / формулы как таковой,

при условии:

def get_bearing(lat1, long1, lat2, long2):
    dLon = (long2 - long1)

    y = math.sin(dLon) * math.cos(lat2)
    x = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dLon)

    brng = math.atan2(y, x)

    brng = np.rad2deg(brng)

    return brng

проблема в том, что результат не соответствует ожидаемому.

Предполагаемое использование функции возвращает отношение между двумя широтными / длинными парами в (очень длинном) списке, т.е.

    lat1 = path[int(len(path) * location / 1000)][0]
    lat2 = path[int(len(path) * location / 1000) + 1][0]
    lng1 = path[int(len(path) * location / 1000)][1]
    lng2 = path[int(len(path) * location / 1000) + 1][1]

В этом случае результат изменения изменяет ориентацию вида графика, гдеподшипник может принимать значение в диапазоне [-180, 180].В идеале, результат должен выглядеть так, чтобы линия, образованная между lat1, lng1 и lat2, lng2, была абсолютно «вертикальной» на графике (аннотации lat / lon переключались на графике), см. Ниже

enter image description here

enter image description here

Я надеюсь, что кто-то сможет вывести проблему из подшипника, возвращенного изфункция и какой должен быть ожидаемый подшипник.Несколько примеров ниже:

Current Location: 30.07134 -97.23076
Next in path: 30.0709 -97.22907
Calculated Bearing: 88.39967863143139
Expected Bearing: ~-70.67

Current Location: 29.91581 -96.85068
Next in path: 29.91556 -96.85021
Calculated Bearing: 118.9170342272798
Expected Bearing: ~122.67

Current Location: 29.69419 -96.53487
Next in path: 29.69432 -96.53466
Calculated Bearing 141.0271357781952
Expected Bearing: ~56

Current Location: 29.77357 -96.07924
Next in path: 29.77349 -96.07876
Calculated Bearing 165.24612555483893
Expected Bearing: ~104

Рады предоставить дополнительную информацию, заранее спасибо за любую / все помощь.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Закончилась смена функции:

from geographiclib.geodesic import Geodesic
...
def get_bearing(lat1, lat2, long1, long2):
    brng = Geodesic.WGS84.Inverse(lat1, long1, lat2, long2)['azi1']
    return brng
0 голосов
/ 25 февраля 2019

Рассматривали ли вы использование pyproj для выполнения расчетов вместо того, чтобы самим кататься?:

import pyproj
geodesic = pyproj.Geod(ellps='WGS84')
fwd_azimuth,back_azimuth,distance = geodesic.inv(lat1, long1, lat2, long2)

В этом примере fwd_azimuth - это подшипник, который вы ищете, и back_azimuth - это обратный азимут (в противоположном направлении).

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

...