2010-06-11 18 views
7

que necesito una función que mapea posiciones GPS a valores X/Y de esta manera:transformada latitud longitud en metros

getXYpos(GeoPoint relativeNullPoint, GeoPoint p){ 
    deltaLatitude=p.latitude-relativeNullPoint.latitude; 
    deltaLongitude=p.longitude-relativeNullPoint.longitude; 
    ... 
    resultX=latitude (or west to east) distance in meters from p to relativeNullPoint 
    resultY=longitude (or south to north) distance in meters from p to relativeNullPoint 
} 

que he visto en algunas implementaciones de "distancia de dos geopuntos", pero todos ellos sólo calcular el aire distancia de línea creo que la deltaLongitude se puede transformar en metros directamente, pero la deltaLatitude depende de la longitud. ¿Alguien sabe cómo se puede resolver este problema?

Respuesta

13

Para empezar, creo que tienes tu latitude y longitude invertidos. La longitud mide X y la latitud mide Y.

La latitud es fácil de convertir en una distancia norte-sur. Sabemos que 360 ​​grados es un círculo completo alrededor de la tierra a través de los polos, y that distance is 40008000 meters. Siempre y cuando no necesite dar cuenta de los errores debido a que la tierra no es perfectamente esférica, la fórmula es deltaLatitude * 40008000/360.

La parte difícil es convertir la longitud en X, como sospechabas. Dado que depende de la latitud que necesita para decidir qué latitud va a utilizar, puede elegir la latitud de su origen, la latitud de su destino o algún punto arbitrario en el medio. La circunferencia en el ecuador (latitud 0) es 40075160 metros. La circunferencia de un círculo en una latitud dada será proporcional al coseno, por lo que la fórmula será deltaLongitude * 40075160 * cos(latitude)/360.

Editar: Tu comentario indica que tienes problemas con la fórmula de longitud; es posible que haya usado grados en lugar de radianes en la llamada al cos, ese es un error común de novato. Para asegurarse de que no haya ambigüedad, aquí está el código de trabajo en Python.

def asRadians(degrees): 
    return degrees * pi/180 

def getXYpos(relativeNullPoint, p): 
    """ Calculates X and Y distances in meters. 
    """ 
    deltaLatitude = p.latitude - relativeNullPoint.latitude 
    deltaLongitude = p.longitude - relativeNullPoint.longitude 
    latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude)) 
    resultX = deltaLongitude * latitudeCircumference/360 
    resultY = deltaLatitude * 40008000/360 
    return resultX, resultY 

Elegí utilizar la latitud relativaNullPoint para el cálculo X. Esto tiene la ventaja de que si convierte varios puntos con la misma longitud, tendrán la misma X; las líneas norte-sur serán verticales.

Editar de nuevo: Debería haber señalado que esta es una fórmula muy simple y debe conocer sus limitaciones. Obviamente, la tierra no es plana, por lo que cualquier intento de asignarla a coordenadas XY implicará algunos compromisos. La fórmula I derivada anteriormente funciona mejor cuando el área que está convirtiendo es lo suficientemente pequeña como para considerarse plana, y donde se puede ignorar la ligera curvatura y el no paralelismo de las líneas norte-sur. Hay toda una ciencia para mapear proyecciones; si quiere ver algunas posibilidades, un buen lugar para comenzar sería Wikipedia. Esta proyección específica se conoce como the Equirectangular projection, con algunas escalas añadidas.

+0

bien, probé esto, y el cálculo de la latitud es muy exacto :) pero los valores de longitud-metro son siempre el factor 1.3 a grande para la prueba de latitud. Creo que no es una buena idea simplemente dividir por este factor porque probablemente difiera para diferentes latitudes, tal vez la circunferencia de la tierra tiene que calcularse en relación con la latitud actual. –

+0

@Sponge, verifique la actualización. –

+0

muchas gracias! funciona genial :) –

2

Función Harvesine es lo que necesita. Compruébelo en moveable-types Hay distancia, rumbo, punto medio y otras cosas La implementación de Javascript funciona realmente bien.

ACTUALIZACIÓN

he encontrado una aplicación Java de la función Harvesine in another stackoverflow question

1

hay bibliotecas en jstott.me.uk para PHP, Java y Javascript el que hacer esto, por ejemplo,

var lld1 = new LatLng(40.718119, -73.995667); // New York 
document.write("New York Lat/Long: " + lld1.toString() + "<br />"); 
var lld2 = new LatLng(51.499981, -0.125313); // London 
document.write("London Lat/Long: " + lld2.toString() + "<br />"); 
var d = lld1.distance(lld2); 
document.write("Surface Distance between New York and London: " + d + "km"); 
Cuestiones relacionadas