Pergunta

Tenho usado o pacote geopy, que faz um ótimo trabalho, porém alguns dos resultados que obtenho são inconsistentes ou vêm com um deslocamento relativamente grande, suspeito que o problema resida no meu cálculo de rumo:

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

Preciso calcular o rumo, st.center_x e center_y são o pivô.depois eu uso geopy para fazer engenharia reversa da coordenada GPS:

latlon = VincentyDistance(miles=dist).destination(Point(lat1, lon1), bearing)

Alguém pode me indicar o que posso estar fazendo de errado?

Foi útil?

Solução

Alguém pode me indicar o que posso estar fazendo de errado?

  1. Não mostrar um exemplo de seus resultados “inconsistentes ou com deslocamento relativamente grande” nem os resultados esperados;conseqüentemente, os respondentes devem confiar em suposições.

  2. Não estou dizendo em quais unidades sua entrada (x, y, etc) é medida e como você obtém a dist usado no destination Cálculo.Estou assumindo (no cálculo bearing2 abaixo) que x positivo está a leste em milhas e y positivo está a norte em milhas.Ajudaria muito se você editasse sua pergunta para corrigir (1) e (2).

  3. Um estilo de codificação que não é muito propício para fazer as pessoas quererem lê-lo...dê uma olhada esse.

  4. Na trigonometria escolar, os ângulos são medidos no sentido anti-horário a partir do eixo X (Leste).Na navegação, os rumos são medidos no sentido horário a partir do eixo Y (Norte).Veja o código abaixo.Para obter um exemplo de rolamento em uso, siga esse link, role para baixo até a seção "Ponto de destino dada distância e rumo do ponto inicial", observe que o exemplo está falando sobre rumos de cerca de 96 ou 97 graus, a seguir clique em "ver mapa" e você notará que o rumo está ligeiramente ao sul do leste (o leste sendo 90 graus).

Código:

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)

Saída:

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

Outras dicas

Não tenho certeza do que você está tentando fazer em seu código, mas vejo algumas estranhezas que talvez precisem ser limpas.

  1. Você testa para dy<=0 depois de testar dy>=0 no condicional antes.O que seu código deve fazer se dy==0 e dx==0.
  2. Seu teste ((dy>=0)and((dx>0)or(dx<0))) é equivalente a (dy>=0 e dx!=0), era isso que você pretendia?
  3. Você está basicamente fazendo a mesma coisa em todas as suas condicionais.Não poderia return math.degrees(math.atan2(dy,dx))+360)%360 funciona em todos os cenários?Nesse caso, você não precisaria usar suas instruções if de qualquer maneira.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top