punto medio entre dos latitud y longitud


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 estoy obteniendo 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. Así que por favor ayúdenme a averiguarlo. P. S. Necesito encontrar la latitud y longitud del punto medio

Author: Allwyn, 2011-01-11

5 answers

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));
}
 65
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 11:08:34

Aún más fácil con Android Google Maps Utilidades :

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

Actualización: Mejor usar el constructor (por qué ver Respuesta de los Malos Perdedores):

LatLngBounds.builder().include(start).include(dest).build().getCenter();
 6
Author: leonardkraemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 23:00:59

También necesita convertir los valores lat y lon utilizados en las otras fórmulas a radianes. Puede ver esto en el código ~3 / 5ths del camino hacia abajo en la página. La pista fue dada al final de la ley esférica de la fórmula de distancia de cosenos:

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

 1
Author: Damien_The_Unbeliever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 11:07:45

Por favor use LatLngBounds con el constructor en lugar del constructor si desea manejar correctamente la transgresión del antimeridiano (longitud +/-180).

Aquí está la prueba que ilustra el problema:

LatLng mp = midPoint(new LatLng(-43.95139,-176.56111),new LatLng(-36.397816,174.663496));
public static LatLng midPoint (LatLng SW, LatLng NE) {
    LatLngBounds bounds = new LatLngBounds(SW, NE);
    Log.d("BAD!", bounds.toString() + " CENTRE: " + bounds.getCenter().toString());
    bounds = LatLngBounds.builder().include(SW).include(NE).build();
    Log.d("GOOD", bounds.toString() + " CENTRE: " + bounds.getCenter().toString());
    return bounds.getCenter();
}

Resultados reales:

BAD!: LatLngBounds{southwest=lat/lng: (-43.95139,-176.56111), northeast=lat/lng: (-36.397816,174.663496)} CENTRE: lat/lng: (-40.174603,-0.948807)
GOOD: LatLngBounds{southwest=lat/lng: (-43.95139,174.663496), northeast=lat/lng: (-36.397816,-176.56111)} CENTRE: lat/lng: (-40.174603,179.051193)

La técnica constructor produce una longitud central de 180 grados!

 1
Author: Bad Loser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 21:48:57

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 entre 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
 -2
Author: Renan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 11:08:50