2014-07-08 18 views
6

In questo momento sto facendo un'applicazione di navigazione per mappe interne e quello che sto cercando di fare è creare un database di punti della mappa nell'edificio.Calcolo distanza PostGis

Tutte le coordinate che utilizzo sono prese da Google Map (che significa che l'EPSG è 3857). Che cosa devo fare ora è trovare la distanza in metri così come utilizzare D_Within in metri

Quando provo ad estrarre la distanza tra 2 punti:

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857), 
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857)) 
FROM i3_building.floordata; 

Per la prima 2 fila con:

Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away) 
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away) 

Risultato dato è:

2.59422435413724e-005 
4.11096095831604e-005 

Anche se sono in rad, il secondo re il livello è due volte più alto del primo. Quindi mi fa confondere. Poi cerco di uscita come metri:

SELECT ST_DISTANCE(
    ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'), 
    ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')')) 
FROM i3_building.floordata; 

Il risultato dato per le stesse righe è:

2.872546829 
4.572207435 

che non è quello che mi aspettavo pure. Io non sono molto familiare con PostGIS e SRID così a questa domanda potrebbe sembrare semplice, ma ti prego di aiutarmi, mi sono bloccato senza @@

risposta

11

Il sistema di riferimento di coordinate (CRS) è 4326, lat/lon. Questa è una fonte comune di confusione con Google Maps: 3857 è il CRS utilizzato da Google Maps per i suoi riquadri e viene proiettato in base a un globo sferico. Le fonti vettoriali aggiunte a Google Maps (dati KML, discariche GPS, ecc.) Tendono ad essere in lat/lon, 4326, misure in gradi e convertite al volo.

Se si desidera la distanza in metri tra due punti lat/lon, utilizzare ST_Distance_Sphere. Ad esempio, per il primo set di punti,

select st_distance_sphere(st_makepoint(103.776047, 1.292149),st_makepoint(103.77607, 1.292212)); 

che dà 7.457 metri. Il secondo set di punti si trova a 62,74 metri l'uno dall'altro, in base alla stessa query.

Nota c'è anche ST_Distance_Spheroid che prende un terzo parametro, la misurazione sferoide, cioè un'approssimazione della forma della terra. Questo sarà potenzialmente più accurato, ma probabilmente non significativo su piccole distanze.

ST_Distance fornisce la distanza in coordinate proiettate, che è probabilmente il motivo per cui si sono ottenuti strani risultati collegando valori lat/lon.

+0

Grazie per la risposta. Ho provato anche il 4326 ma non molto diverso dal 3857. Per la distanza del primo set, è a 3 metri di distanza, dato che è all'interno del mio ufficio quindi lo conosco abbastanza bene. Cerco anche di calcolarlo da qui: http://boulter.com/gps/distance/ - stesso risultato, 3 metri. –

+0

Cosa intendi per non molto diverso? Direi 7,45 metri e 62,74 sono abbastanza diversi. È st_distance_sphere che è il problema, però, dato che prende input in lat/lon, dove st_distance prende la distanza nelle coordinate proiettate. 3857 e 4326 sono radicalmente diversi, misurando rispettivamente metri e gradi, ma è necessario collegarli alle funzioni corrette per ottenere le risposte corrette: D –

+0

Scusa, basta uscire e provare a misurare, circa 7 metri è abbastanza corretto.Grazie per l'aiuto :) –

Problemi correlati