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

Postgis SQL für nächste Nachbarn

Erstens:Wenn Sie Längen- und Breitengrad verwenden, müssen Sie 4326 verwenden.

UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;

Dann erstellen Sie einen Index für das Geom-Feld

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

Dann erhalten Sie die kNN-Nachbarn:

SELECT *,ST_Distance(geom,'SRID=4326;POINT(newLon newLat)'::geometry) 
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;

Diese Abfrage nutzt die kNN-Funktionalität des Gist-Index (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Die zurückgegebene Entfernung wird jedoch in Grad und nicht in Metern angegeben (Projektion 4326 verwendet Grad).

Um dies zu beheben:

SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)') 
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;

Verwenden Sie bei der Berechnung von ST_distance den Geografietyp. Dort wird die Entfernung immer in Metern angegeben:

http://workshops.boundlessgeo.com/postgis-intro/geography.html

All diese Funktionalität wird wahrscheinlich eine aktuelle Postgis-Version (2.0+) benötigen. Ich bin mir aber nicht sicher.

Überprüfen Sie dies als Referenz https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/