sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man konfigurerar PostgreSQL med Postgis för att beräkna avstånd

Kort svar:

Konvertera bara dina x,y värden i farten med ST_MakePoint (tänk på överheaden!) och beräkna avståndet från en given punkt, standard SRS kommer att vara WGS84 :

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

Använder GEOGRAPHY du får resultatet i meter när du använder GEOMETRY kommer att ge det i grader. Naturligtvis är det absolut nödvändigt att känna till SRS för koordinatpar för att beräkna avstånd, men om du har kontroll över datakvaliteten och koordinaterna är konsekventa (i det här fallet utelämnar SRS), finns det inte mycket att oroa sig för. Det kommer att börja bli knepigt om du planerar att utföra operationer med hjälp av extern data, från vilken du inte heller känner till SRS och den kan skilja sig från din.

Långt svar:

Tja, om du använder PostGIS bör du inte använda x,y i separerade kolumner i första hand. Du kan enkelt lägga till en kolumn för geometri/geografi genom att göra något liknande.

Det här är ditt bord ...

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

Innehåller följande data ..

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

Så här lägger du till en kolumn för geografityp:

ALTER TABLE places ADD COLUMN geo GEOGRAPHY;

När din kolumn har lagts till är det så här du konverterar dina koordinater till geografi/geometri och uppdaterar din tabell:

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

För att beräkna avståndet behöver du bara använda funktionen ST_Distance , enligt följande (avstånd i meter):

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

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

Om du har din platsparameter i WKT , kan du också använda:

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



  1. Kombinera flera rader med olika datum med överlappande variabler (för att fånga första och senaste ändringsdatum)

  2. Inte en giltig månad i oracle när add_months används

  3. Mysql väljer räknevärden från en enda kolumn

  4. Nginx-konfiguration med Magento 1.8