2010-06-11 22 views
7

ho bisogno di una funzione che mappa le posizioni GPS per x/valori y come questo:trasformano longitudine latitudine in metri

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 
} 

ho visto alcune implementazioni di "distanza di due geoPoints" ma tutti solo calcolare l'aria -line distanza. Penso che il deltaLongitude possa essere trasformato in metri direttamente ma il deltaLatitude dipende dalla longitudine. qualcuno sa come questo problema può essere risolto?

risposta

13

Per cominciare, penso che tu abbia il tuo latitude e longitude invertiti. Misure di longitudine X e misure di latitudine Y.

La latitudine è facile da trasformare in una distanza nord-sud. Sappiamo che 360 ​​gradi è un cerchio completo intorno alla terra attraverso i poli e that distance is 40008000 meters. Finché non è necessario tenere conto degli errori dovuti al fatto che la terra non è perfettamente sferica, la formula è deltaLatitude * 40008000/360.

La parte difficile è convertire la longitudine in X, come sospettavate. Dal momento che dipende dalla latitudine, devi decidere quale latitudine utilizzerai: potresti scegliere la latitudine della tua origine, la latitudine della tua destinazione o qualche punto arbitrario nel mezzo. La circonferenza all'equatore (latitudine 0) è 40075160 metri. La circonferenza di un cerchio a una data latitudine sarà proporzionale al coseno, quindi la formula sarà deltaLongitude * 40075160 * cos(latitude)/360.

Modifica: Il commento indica che si sono verificati problemi con la formula di longitudine; potresti aver usato gradi invece di radianti nella chiamata a cos, questo è un errore comune da principiante. Per assicurarsi che non ci siano ambiguità, ecco il codice funzionante in 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 

Ho scelto di utilizzare la latitudine relativa NullPoint per il calcolo X. Questo ha il vantaggio che se si convertono più punti con la stessa longitudine, avranno la stessa X; le linee nord-sud saranno verticali.

Modifica di nuovo: Avrei dovuto sottolineare che questa è una formula molto semplice e dovresti conoscere i suoi limiti. Ovviamente la terra non è piatta, quindi qualsiasi tentativo di mapparlo alle coordinate XY comporterà dei compromessi. La formula che ho descritto sopra funziona meglio quando l'area che stai convertendo è abbastanza piccola da considerarla piatta, e dove la leggera curvatura e il non parallelismo delle linee nord-sud possono essere ignorati. C'è un'intera scienza per mappare le proiezioni; se vuoi vedere alcune possibilità, un buon punto di partenza sarebbe Wikipedia. Questa proiezione specifica è nota come the Equirectangular projection, con alcuni ridimensionamenti aggiunti.

+0

ok ho provato questo, e il calcolo della latitudine è molto preciso :) ma i valori di longitudine-metro sono sempre il fattore 1.3 a grande per il test di latitudine im. Penso che non sia una buona idea dividere semplicemente per questo fattore perché probabilmente differirà per le diverse latitudini, forse la circonferenza terrestre deve essere calcolata rispetto alla latitudine corrente? –

+0

@Sponge, controllare l'aggiornamento. –

+0

grazie mille! funziona benissimo :) –

2

La funzione Harvesine è ciò di cui hai bisogno. Check it out a moveable-types Ci sono Distance, Bearing, Midpoint e altre cose L'implementazione di Javascript funziona davvero bene.

UPDATE

ho trovato un'implementazione Java di funzione Harvesine in another stackoverflow question

1

Non ci sono librerie su jstott.me.uk per PHP, Java e Javascript che fare questo, ad esempio,

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"); 
Problemi correlati