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

Sådan konfigureres PostgreSQL med Postgis til at beregne afstande

Kort svar:

Bare konverter din x,y værdier på farten ved hjælp af ST_MakePoint (pas på overhead!) og beregn afstanden fra et givet punkt, vil standard SRS være WGS84 :

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

Brug af GEOGRAPHY du vil få resultatet i meter, mens du bruger GEOMETRY vil give det i grader. Selvfølgelig er det bydende nødvendigt at kende SRS for koordinatpar for at beregne afstande, men hvis du har kontrol over datakvaliteten og koordinaterne er konsistente (i dette tilfælde udelade SRS), er der ikke meget at bekymre sig om. Det vil begynde at blive vanskeligt, hvis du planlægger at udføre operationer ved hjælp af eksterne data, hvorfra du heller ikke kender til SRS, og det kan afvige fra dit.

Langt svar:

Nå, hvis du bruger PostGIS, burde du ikke bruge x,y i adskilte kolonner i første omgang. Du kan nemt tilføje en geometri-/geografikolonne ved at gøre sådan noget.

Dette er dit bord ...

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

Indeholder følgende data ..

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

Sådan tilføjer du en kolonne med geografitype:

ALTER TABLE places ADD COLUMN geo GEOGRAPHY;
 

Når din kolonne er tilføjet, er det sådan, du konverterer dine koordinater til geografi/geometri og opdaterer din tabel:

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

For at beregne afstanden skal du blot bruge funktionen ST_Distance , som følger (afstand i meter):

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

Hvis du har din placeringsparameter i WKT , kan du også bruge:

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


  1. Sådan får du listedag i månedsdata pr. måned i postgresql

  2. NodeJS kunne ikke oprette forbindelse til MYSQL seneste version inde i Docker Container

  3. String_agg for flere kolonner

  4. ld:bibliotek blev ikke fundet for -lzstd under pakkeinstallation til mysql2 gem Ruby på macOS Big Sur 11.4