sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgis SQL para vecinos más cercanos

Primero, si está usando latitud, longitud, necesita usar 4326.

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

Luego creas un índice en el campo geom

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

Luego obtienes los vecinos 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;

Esta consulta aprovechará la funcionalidad kNN del índice esencial (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Aún así, la distancia devuelta estará en grados, no en metros (la proyección 4326 usa grados).

Para arreglar esto:

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

Cuando calcule ST_distance, use el tipo de geografía. La distancia siempre está en metros:

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

Toda esta funcionalidad probablemente necesitará una versión reciente de Postgis (2.0+). Aunque no estoy seguro.

Verifique esto como referencia https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/