PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgis SQL para vizinhos mais próximos


Primeiro, se você estiver usando latitude, longitude, precisará usar 4326.
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;

Então você cria um índice no campo geom
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

Então você obtém os vizinhos 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;

Essa consulta aproveitará a funcionalidade kNN do índice gist (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Ainda assim, a distância retornada será em graus, não em metros (a projeção 4326 usa graus).

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

Ao calcular a distância_ST, use o tipo de geografia. A distância é sempre em metros:

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

Toda essa funcionalidade provavelmente precisará de uma versão recente do Postgis (2.0+). Eu não tenho certeza.

Verifique isso para referência https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/