Подшипник между двумя точками
Я использовал пакет geopy, который отлично справляется с работой, однако некоторые результаты, которые я получаю, являются несовместимыми или имеют относительно большое смещение, я подозреваю, что проблема связана с моим расчетом подшипников:
def gb(x,y,center_x,center_y):
dx=x-center_x
dy=y-center_y
if ((dy>=0)and((dx>0)or(dx<0))):
return math.degrees(math.atan2(dy,dx))
elif (dy<=0)and((dx>0)or (dx<0)):
return (math.degrees(math.atan2(dy,dx))+360)
else:
return (math.degrees(math.atan2(dy,dx))+360)%360
Мне нужно рассчитать подшипник, st center_x и center_y - это опорная точка. После этого я использую Geopy для обратного проектирования координаты GPS:
latlon = VincentyDistance(miles=dist).destination(Point(lat1, lon1), bearing)
Может кто-нибудь указать мне, что я могу делать не так?
2 ответа
Может кто-нибудь указать мне, что я могу делать не так?
Не показывать пример ваших "непоследовательных или сравнительно больших результатов" или ваших ожидаемых результатов; следовательно, ответчики должны полагаться на догадки.
Не говорите, в каких единицах измерения ваш вход (х, у и т. Д.), И как вы получаете
dist
используется вdestination
расчет. Я предполагаю (в расчетеbearing2
ниже), что положительный х в восточном направлении в милях, а положительный у в северном направлении в милях. Это очень поможет, если вы отредактируете свой вопрос, чтобы исправить (1) и (2).Стиль кодирования, который не очень-то способствует тому, чтобы люди захотели его прочитать... взгляните на это.
В школьной тригонометрии углы измеряются против часовой стрелки от оси X (восток). В навигации подшипники измеряются по часовой стрелке от оси Y (север). Смотрите код ниже. Для примера использования подшипника перейдите по этой ссылке, прокрутите вниз до раздела "Заданная точка с указанным расстоянием и ориентир от начальной точки", обратите внимание, что в примере речь идет о подшипниках с углом около 96 или 97 градусов, затем нажмите "просмотреть карту". "и вы заметите, что курс немного южнее востока (восток 90 градусов).
Код:
from math import degrees, atan2
def gb(x, y, center_x, center_y):
angle = degrees(atan2(y - center_y, x - center_x))
bearing1 = (angle + 360) % 360
bearing2 = (90 - angle) % 360
print "gb: x=%2d y=%2d angle=%6.1f bearing1=%5.1f bearing2=%5.1f" % (x, y, angle, bearing1, bearing2)
for pt in ((0, 1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1, 0),(-1,1)):
gb(pt[0], pt[1], 0, 0)
Выход:
gb: x= 0 y= 1 angle= 90.0 bearing1= 90.0 bearing2= 0.0
gb: x= 1 y= 1 angle= 45.0 bearing1= 45.0 bearing2= 45.0
gb: x= 1 y= 0 angle= 0.0 bearing1= 0.0 bearing2= 90.0
gb: x= 1 y=-1 angle= -45.0 bearing1=315.0 bearing2=135.0
gb: x= 0 y=-1 angle= -90.0 bearing1=270.0 bearing2=180.0
gb: x=-1 y=-1 angle=-135.0 bearing1=225.0 bearing2=225.0
gb: x=-1 y= 0 angle= 180.0 bearing1=180.0 bearing2=270.0
gb: x=-1 y= 1 angle= 135.0 bearing1=135.0 bearing2=315.0
Я не совсем уверен, что вы пытаетесь сделать в своем коде, но я вижу некоторые странности, которые, возможно, придется устранить.
- Вы тестируете на
dy<=0
после теста наdy>=0
в условном до. Что должен делать ваш код, еслиdy==0
а такжеdx==0
, - Ваш тест
((dy>=0)and((dx>0)or(dx<0)))
эквивалентно (dy>=0 и dx!=0), это то, что вы хотели? - Вы в основном делаете одно и то же во всех своих условных выражениях. не удалось
return math.degrees(math.atan2(dy,dx))+360)%360
работать в каждом сценарии? В этом случае вам не нужно будет использовать ваши операторы if в любом случае.