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

Postgis SQL per i vicini più vicini

Innanzitutto, se stai utilizzando latitudine, longitudine, devi utilizzare 4326.

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

Quindi crei un indice sul campo geom

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

Quindi ottieni i vicini kNN:

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

Questa query sfrutterà la funzionalità kNN dell'indice gist (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Tuttavia, la distanza restituita sarà in gradi, non in metri (la proiezione 4326 utilizza i gradi).

Per risolvere questo problema:

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

Quando calcoli ST_distance, usa il tipo geografia. La distanza è sempre in metri:

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

Tutte queste funzionalità avranno probabilmente bisogno di una versione recente di Postgis (2.0+). Non ne sono sicuro però.

Controllare questo per riferimento https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-neighbor-query/