2012-04-12 8 views
16

Estoy teniendo un momento difícil para entender mi Trigonometría. Intento deducir una latitud y longitud de destino desde un lat y un tronco de inicio y una distancia y un rumbo.calculando Lat y Long desde Teniendo y Distancia

Afortunadamente, me encontré con un sitio increíble que describe exactamente la función que necesito: http://www.movable-type.co.uk/scripts/latlong.html "punto de destino determinada distancia y el rumbo desde el punto de partida" lo probé en mi programa Java, pero no está funcionando para mí. Lo implementé como decía el sitio web. Aquí está mi código:

double dist = 150/6371; 
double brng = Math.toRadians(90); 
double lat1 = Math.toRadians(26.88288045572338); 
double lon1 = Math.toRadians(75.78369140625); 

double lat2 = Math.asin(Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng)); 
double a = Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1), Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2)); 
System.out.println("a = " + a); 
double lon2 = lon1 + a; 

lon2 = (lon2+ 3*Math.PI) % (2*Math.PI) - Math.PI; 

System.out.println("Latitude = "+Math.toDegrees(lat2)+"\nLongitude = "+Math.toDegrees(lon2)); 

Pero muestra la salida es:

a = 0.0 
Latitude = 26.882880455723377 
Longitude = 75.78369140625 

No estoy recibiendo, donde estoy haciendo el error. Por favor, cualquiera puede ayudarme a descubrir el problema.

Gracias por adelantado. :-)

+4

Thre son algunas pequeñas y agradables bibliotecas para ayudar con esto, p. http://code.google.com/p/simplelatlng/wiki/GettingStarted –

+0

Mark: muchas gracias por esta pequeña conexión. – Vaiden

Respuesta

13

Tu problema está en la primera línea.

Trate

double dist = 150.0/6371.0; 

La razón es que 150/6371 consigue calcula como 0, ya que realiza una división entera (en lugar de división de coma flotante). Esto es cierto aunque el resultado se almacena en un double. Puede forzar la división de punto flotante haciendo que uno de los dos números sea un punto flotante literal.

+1

¿Puede alguien decirme qué es eso de 150, es millas? Estoy buscando implementar este mismo escenario – devdar

+2

Creo que son kilómetros, dado el radio de la tierra. – lcguida

+0

He utilizado este para convertir latitud y longitud: 22.369131978392012,114.11357168108225 a startpoint latitud, longitud: 0.39041812966877465,1.991668182365113 con distancia recorrida (en km) como 0.06574748992919921 ¿Podría decirme la manera de calcular la distancia entre? –

5

si alguien necesita una función que calcula coordenadas de punto desde otro punto movido por cierta distancia, a continuación se muestra el código de trabajo. Para mí, solo está moviendo un punto a cierta distancia.

import static java.lang.Math.*; 

void movePoint(double latitude, double longitude, double distanceInMetres, double bearing) { 
    double brngRad = toRadians(bearing); 
    double latRad = toRadians(latitude); 
    double lonRad = toRadians(longitude); 
    int earthRadiusInMetres = 6371000; 
    double distFrac = distanceInMetres/earthRadiusInMetres; 

    double latitudeResult = asin(sin(latRad) * cos(distFrac) + cos(latRad) * sin(distFrac) * cos(brngRad)); 
    double a = atan2(sin(brngRad) * sin(distFrac) * cos(latRad), cos(distFrac) - sin(latRad) * sin(latitudeResult)); 
    double longitudeResult = (lonRad + a + 3 * PI) % (2 * PI) - PI; 

    System.out.println("latitude: " + toDegrees(latitudeResult) + ", longitude: " + toDegrees(longitudeResult)); 
} 
  • latitud, longitud - punto de entrada coordina
  • distanceInMetres - distancia a la que desea mover el punto de
  • teniendo - un ángulo, la dirección hacia la que se quiero mover el punto 0 es hacia el norte, 90 - este, 180 - sur, 270 - oeste. Y todo en el medio, es decir 45 es noreste.
  • earthRadiusInMetres - Radio de la Tierra en metros.

Puede modificar el área para 6371 si usted quiere tener la entrada en kilómetros o millas, si usted quiere tener la entrada en millas.

Cuestiones relacionadas