Подшипник между двумя точками - PullRequest
5 голосов
/ 20 февраля 2011

Я использовал пакет 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 ]

8 голосов
/ 21 февраля 2011

Может кто-нибудь указать мне на то, что я могу делать неправильно?

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

  2. Не говорите, в каких единицах измерения измеряется ваш вход (x, y и т. д.), и как вы используете dist, использованное в destinationрасчет.Я предполагаю (при расчете bearing2 ниже), что положительное значение x указывает на восток в милях, а положительное значение y указывает на север в милях.Было бы очень полезно, если бы вы отредактировали ваш вопрос, чтобы исправить (1) и (2).

  3. Стиль кодирования, который не очень способствует тому, чтобы люди захотели его прочитать ...взгляните через this .

  4. В школьной тригонометрии углы измеряются против часовой стрелки от оси 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
2 голосов
/ 20 февраля 2011

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

  1. Вы проверяете на dy<=0 после того, как проверяете на dy>=0 в условном до. Что должен делать ваш код, если dy==0 и dx==0.
  2. Ваш тест ((dy>=0)and((dx>0)or(dx<0))) эквивалентен (dy> = 0 и dx! = 0), это то, что вы намеревались?
  3. Вы в основном делаете одно и то же во всех своих условных выражениях. Не может return math.degrees(math.atan2(dy,dx))+360)%360 работать в каждом сценарии? В этом случае вам не нужно будет использовать ваши операторы if.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...