Teniendo entre dos puntos

He estado usando el paquete geopy, que hace un gran trabajo, sin embargo, algunos de los resultados que obtengo son inconsistentes o vienen con un desplazamiento relativamente grande, sospecho que el problema reside en mi cálculo del rodamiento:

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 (dy0)or (dx<0)): return (math.degrees(math.atan2(dy,dx))+360) else: return (math.degrees(math.atan2(dy,dx))+360)%360 

Necesito calcular el rodamiento, st center_x y center_y son el pivote. luego uso geopy para aplicar ingeniería inversa a la coordenada gps:

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

¿Alguien puede señalarme qué podría estar haciendo mal?

¿Alguien puede señalarme qué podría estar haciendo mal?

  1. No muestra un ejemplo de sus resultados “inconsistentes o con un desplazamiento relativamente grande” ni sus resultados esperados; En consecuencia, los respondedores deben confiar en las conjeturas.

  2. Sin decir en qué unidades se mide su entrada (x, y, etc.), y cómo obtiene el dist utilizado en el cálculo de destination . Supongo (en el cálculo del bearing2 continuación) que la x positiva está orientada hacia el este en millas y la y positiva hacia la norte en millas. Sería de gran ayuda si tuviera que editar su pregunta para corregir (1) y (2).

  3. Un estilo de encoding que no es muy propicio para que la gente quiera leerlo … échale un vistazo a esto .

  4. En la trigonometría escolar, los angularjs se miden en sentido contrario a las agujas del reloj desde el eje X (Este). En la navegación, los rodamientos se miden en sentido horario desde el eje Y (norte). Ver código a continuación. Para ver un ejemplo del rumbo en uso, siga este enlace , desplácese hacia abajo hasta la sección “Destino de la distancia dada y el rumbo desde el punto de inicio”, observe que el ejemplo habla de rodamientos de aproximadamente 96 o 97 grados, luego haga clic en “ver mapa “y notará que el rumbo es ligeramente al sur del este (este está a 90 grados).

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) 

Salida:

 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 

No estoy muy seguro de lo que estás tratando de hacer en tu código, pero veo algunas rarezas que pueden necesitar ser eliminadas.

  1. Prueba para dy<=0 después de probar dy>=0 en el condicional anterior. ¿Qué debe hacer su código si dy==0 y dx==0 .
  2. Su prueba ((dy>=0)and((dx>0)or(dx<0))) es equivalente a (dy> = 0 y dx! = 0), ¿es esto lo que quería?
  3. Básicamente estás haciendo lo mismo en todos tus condicionales. ¿No se pudo return math.degrees(math.atan2(dy,dx))+360)%360 en cada escenario? En ese caso, no necesitarías usar tus declaraciones if de todos modos.