punto medio entre dos latitudes y longitudes

Estoy intentando 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 donde se dan sus latitudes y longitudes

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 si el dLon es correcto o no. Entonces, por favor, ayúdenme chicos a resolverlo. PSI necesita encontrar la latitud y la longitud del punto medio

Debes 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)); } 

incluso más fácil con Android Google Maps Utilities :

 LatLngBounds bounds = new LatLngBounds(start, dest); bounds.getCenter(); 

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 fue dada al final de la ley esférica de la fórmula de distancia coseno:

(Tenga en cuenta que aquí y en todos los fragmentos de código subsiguientes, por simplicidad, no muestro las conversiones de grados a radianes, vea a continuación las versiones completas).

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.. 

Puedes obtener el punto medio dividiendo la distancia 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