PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So konfigurieren Sie PostgreSQL mit Postgis, um Entfernungen zu berechnen

Kurze Antwort:

Wandeln Sie einfach Ihr x,y um Werte on the fly mit ST_MakePoint (achten Sie auf den Overhead!) und die Entfernung von einem bestimmten Punkt berechnen, ist die Standard-SRS WGS84 :

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

Verwenden von GEOGRAPHY Sie erhalten das Ergebnis in Metern, wenn Sie GEOMETRY verwenden wird es in Grad geben. Natürlich ist die Kenntnis der SRS von Koordinatenpaaren für die Berechnung von Entfernungen unerlässlich, aber wenn Sie die Kontrolle über die Datenqualität haben und die Koordinaten konsistent sind (in diesem Fall wird die SRS weggelassen), müssen Sie sich keine Sorgen machen. Schwierig wird es, wenn Sie vorhaben, Operationen mit externen Daten durchzuführen, von denen Sie das SRS ebenfalls nicht kennen und es sich von Ihrem unterscheiden könnte.

Lange Antwort:

Nun, wenn Sie PostGIS verwenden, sollten Sie x,y nicht verwenden zunächst in getrennten Spalten. Sie können ganz einfach eine Geometrie-/Geographie-Spalte hinzufügen, indem Sie so etwas tun.

Das ist Ihre Tabelle ...

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

Enthält die folgenden Daten ..

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

So fügen Sie eine Geografietypspalte hinzu:

ALTER TABLE places ADD COLUMN geo GEOGRAPHY;

Sobald Ihre Spalte hinzugefügt wurde, wandeln Sie Ihre Koordinaten in Geografie/Geometrie um und aktualisieren Ihre Tabelle:

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

Um die Entfernung zu berechnen, müssen Sie nur die Funktion ST_Distance verwenden , wie folgt (Entfernung in Metern):

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

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

Wenn Sie Ihren Standortparameter in WKT haben , können Sie auch verwenden:

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