PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment configurer PostgreSQL avec Postgis pour calculer les distances

Réponse courte :

Convertissez simplement votre x,y valeurs à la volée en utilisant ST_MakePoint (attention aux frais généraux !) et calculez la distance à partir d'un point donné, le SRS par défaut sera WGS84 :

SELECT ST_Distance(ST_MakePoint(lon,lat)::GEOGRAPHY,
                   ST_MakePoint(23.73,37.99)::GEOGRAPHY) FROM places;

Utilisation de GEOGRAPHY vous obtiendrez le résultat en mètres, en utilisant GEOMETRY le donnera en degrés. Bien sûr, connaître le SRS des paires de coordonnées est impératif pour calculer les distances, mais si vous contrôlez la qualité des données et que les coordonnées sont cohérentes (dans ce cas, en omettant le SRS), il n'y a pas grand-chose à craindre. Cela commencera à devenir délicat si vous envisagez d'effectuer des opérations à l'aide de données externes, dont vous ignorez également le SRS et qui peuvent différer des vôtres.

Réponse longue :

Eh bien, si vous utilisez PostGIS, vous ne devriez pas utiliser x,y dans des colonnes séparées en premier lieu. Vous pouvez facilement ajouter une colonne de géométrie/géographie en faisant quelque chose comme ça.

Ceci est votre tableau ...

CREATE TABLE places (place TEXT, lon NUMERIC, lat NUMERIC);

Contenant les données suivantes ..

INSERT INTO places VALUES ('Budva',18.84,42.92),
                          ('Ohrid',20.80,41.14);

Voici comment ajouter une colonne de type géographique :

ALTER TABLE places ADD COLUMN geo GEOGRAPHY;

Une fois votre colonne ajoutée, voici comment convertir vos coordonnées en géographie/géométrie et mettre à jour votre tableau :

UPDATE places SET geo = ST_MakePoint(lon,lat);

Pour calculer la distance il suffit d'utiliser la fonction ST_Distance , comme suit (distance en mètres) :

SELECT ST_Distance(geo,ST_MakePoint(23.73,37.99)) FROM places;

   st_distance   
-----------------
 686560.16822422
 430876.07368955
(2 Zeilen)

Si vous avez votre paramètre de localisation dans WKT , vous pouvez également utiliser :

SELECT ST_Distance(geo,'POINT(23.73 37.99)') FROM places;
   st_distance   
-----------------
 686560.16822422
 430876.07368955
(2 Zeilen)