2011-01-11 25 views
23

Estoy tratando de convertir el fragmento de código dado en este http://www.movable-type.co.uk/scripts/latlong.html en java. Pero no obtengo el mismo resultado que el del sitio. Aquí está mi código para encontrar el punto medio entre dos puntos en los que se dan sus latitudes y longitudespunto medio entre dos latitud y longitud

midPoint(12.870672,77.658964,12.974831,77.60935); 
    public static void midPoint(double lat1,double lon1,double lat2,double lon2) 
    { 
    double dLon = Math.toRadians(lon2-lon1); 
     double Bx = Math.cos(lat2) * Math.cos(dLon); 
     double By = Math.cos(lat2) * Math.sin(dLon); 
     double lat3 = Math.atan2(Math.sin(lat1)+Math.sin(lat2),Math.sqrt((Math.cos(lat1)+Bx)*(Math.cos(lat1)+Bx) + By*By)); 
     double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 
     System.out.print(lat3 +" " + lon3); 
    } 

No estoy seguro de whethe dLon es correcta o no. Entonces, por favor, ayúdenme chicos a resolverlo. P.S.I necesita encontrar la latitud y longitud del punto medio

Respuesta

62

Necesita convertir a radianes. Cámbielo a lo siguiente:

public static void midPoint(double lat1,double lon1,double lat2,double lon2){ 

    double dLon = Math.toRadians(lon2 - lon1); 

    //convert to radians 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 
    lon1 = Math.toRadians(lon1); 

    double Bx = Math.cos(lat2) * Math.cos(dLon); 
    double By = Math.cos(lat2) * Math.sin(dLon); 
    double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By)); 
    double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 

    //print out in degrees 
    System.out.println(Math.toDegrees(lat3) + " " + Math.toDegrees(lon3)); 
} 
+0

Gracias por su ayuda :-) – Allwyn

+0

Gracias por la fórmula. ! –

+0

Hola @dogbane, necesito una ayuda. http://stackoverflow.com/questions/11758582/find-if-the-current-location-is-along-a-straight-line-drawn-between-two-points – RVG

1

Necesita convertir los valores lat y lon utilizados en las otras fórmulas a Radians también. Puedes ver esto en el código ~ 3/5ths del camino hacia abajo de la página. La pista se da al final de la ley esférica de fórmula de la distancia cosenos:

(Tenga en cuenta que aquí y en todos los fragmentos de código siguientes, por simplicidad no muestro conversiones de grados a radianes; véase a continuación para las versiones completas)

-1

Mi último trabajo hice un módulo de seguimiento y estaba usando esta fórmula para calcular la distancia entre 2 coordenadas.

//Location lat and lon 
double locLat = -23.548333; 
double locLon = -46.636111; 

//Destination lat and lon 
double dstLat = -22.902778; 
double dstLon = -43.206667; 

double arcoAB = 90 - (dstLat); 
double arcoAC = 90 - (locLat); 

double difLon = locLon - (dstLon); 

double cosA = Math.cos(Math.toRadians(arcoAC)) * Math.cos(Math.toRadians(arcoAB)) + Math.sin(Math.toRadians(arcoAC)) * Math.sin(Math.toRadians(arcoAB)) * Math.cos(Math.toRadians(difLon)); 
double acosCosA = Math.toDegrees(Math.acos(cosA)); 

double raio = 2 * Math.PI * 6371; 
double distance = (raio * acosCosA)/360; 

return distance; //Distance in KM, convert to anything else (miles, meters..) if you need.. 

usted puede conseguir el punto que divide la distancia mediados por 2.

Ah, esta otra fórmula también funciona:

double dLat = Math.toRadians(dstLat - locLat); 
double dLon = Math.toRadians(dstLon - locLon); 

double a = Math.sin(dLat/2) * Math.sin(dLat/2) 
      + Math.cos(Math.toRadians(locLat)) * Math.cos(Math.toRadians(dstLat)) 
      * Math.sin(dLon/2) * Math.sin(dLon/2); 
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
double d = 6371 * c; 

return d; //Distance in KM 
+1

Pero necesito encontrar la latitud y la longitud de el punto medio ¿Como hacer eso? – Allwyn

+0

@scooby ¿Encontraste alguna solución para lo mismo? – JgdGuy

Cuestiones relacionadas