2014-07-08 4 views
6

Je fais actuellement une application de navigation cartographique intérieure et ce que j'essaie de faire est de construire une base de données de la carte dans le bâtiment.Calcul de distance PostGis

Toutes les coordonnées que j'utilise proviennent de Google Map (ce qui signifie que l'EPSG est 3857). Ce que je dois faire maintenant est de trouver la distance en mètres ainsi que l'utilisation D_Within en mètres

Lorsque je tente d'extraire la distance entre 2 points:

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

Pour la première 2 rangée avec:

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) 

résultat donné est:

2.59422435413724e-005 
4.11096095831604e-005 

Même si elles sont en rad, la deuxième re sult est seulement deux fois plus élevé que le premier. Donc ça me rend confus. Puis j'essaie de sortie comme mètres:

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

Le résultat donné pour les mêmes lignes est:

2.872546829 
4.572207435 

Ce qui est pas ce que je pensais aussi. Je ne suis pas très familier avec PostGis et SRID si cette question peut sembler simple, mais s'il vous plaît, aidez-moi, je suis coincé pas

@@

Répondre

11

Votre système de coordonnées de référence (CRS) est 4326, latitude/longitude. Ceci est une source courante de confusion avec Google Maps: 3857 est le CRS utilisé par Google Maps pour ses tuiles, et est projeté mètres basés sur un globe sphérique. Les sources vectorielles qui sont ajoutées à Google Maps (données KML, décharges GPS, etc.) ont tendance à être en lat/lon, 4326, ce qui est des mesures en degrés et converties à la volée.

Si vous voulez la distance en mètres entre deux points lat/lon, utilisez ST_Distance_Sphere. Par exemple, pour votre premier ensemble de points,

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

qui donne 7,457 mètres. Votre deuxième ensemble de points est à 62,74 mètres l'un de l'autre, basé sur la même requête. Notez qu'il existe également ST_Distance_Spheroid qui prend un troisième paramètre, le sphéroïde de mesure, c'est-à-dire une approximation de la forme de la Terre. Cela sera potentiellement plus précis, mais probablement pas significatif sur de petites distances. ST_Distance donne la distance dans les coordonnées projetées, ce qui est probablement la raison pour laquelle vous avez obtenu des résultats étranges en branchant des valeurs lat/lon.

+0

Merci pour votre réponse. J'ai essayé le 4326 mais pas très différent de 3857. Pour la distance du premier set, il est à 3 mètres, puisqu'il est à l'intérieur de mon bureau donc je le connais très bien. J'essaie aussi de le calculer à partir d'ici: http://boulter.com/gps/distance/ - même résultat, 3 mètres. –

+0

Que voulez-vous dire par pas très différent? Je dirais que 7,45 mètres et 62,74 sont très différents. C'est st_distance_sphere qui est le problème, car cela prend une entrée dans lat/lon, où st_distance prend de la distance dans les coordonnées projetées. 3857 et 4326 sont radicalement différents, étant respectivement des mètres et des degrés, mais vous devez les brancher dans les bonnes fonctions pour obtenir les bonnes réponses: D –

+0

Désolé, sortez et essayez de mesurer, environ 7 mètres est tout à fait correct.Merci pour l'aide :) –