PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come configurare PostgreSQL con Postgis per calcolare le distanze

Risposta breve:

Converti semplicemente il tuo x,y valori al volo utilizzando ST_MakePoint (attenzione alle spese generali!) e calcola la distanza da un determinato punto, l'SRS predefinito sarà WGS84 :

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

Utilizzando GEOGRAPHY otterrai il risultato in metri, usando GEOMETRY lo darà in gradi. Naturalmente, conoscere l'SRS delle coppie di coordinate è fondamentale per calcolare le distanze, ma se si ha il controllo della qualità dei dati e le coordinate sono coerenti (in questo caso, omettendo l'SRS), non c'è molto di cui preoccuparsi. Inizierà a diventare complicato se stai pianificando di eseguire operazioni utilizzando dati esterni, dai quali non sei nemmeno a conoscenza dell'SRS e potrebbe differire dai tuoi.

Risposta lunga:

Bene, se stai usando PostGIS non dovresti usare x,y in primo luogo in colonne separate. Puoi facilmente aggiungere una colonna di geometria/geografia facendo qualcosa del genere.

Questa è la tua tavola...

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

Contenente i seguenti dati ..

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

Ecco come aggiungere una colonna di tipo geografico:

ALTER TABLE places ADD COLUMN geo GEOGRAPHY;

Una volta aggiunta la colonna, ecco come convertire le coordinate in geografia/geometria e aggiornare la tabella:

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

Per calcolare la distanza è sufficiente utilizzare la funzione ST_Distance , come segue (distanza in metri):

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

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

Se hai il parametro della tua posizione in WKT , puoi anche usare:

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