PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgis SQL pour les voisins les plus proches

Tout d'abord, si vous utilisez la latitude, la longitude, vous devez utiliser 4326.

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

Ensuite, vous créez un index sur le champ geom

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

Ensuite, vous obtenez les voisins 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;

Cette requête tirera parti de la fonctionnalité kNN de l'index gist (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

La distance renvoyée sera toujours en degrés et non en mètres (la projection 4326 utilise des degrés).

Pour résoudre ce problème :

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

Lorsque vous calculez ST_distance, utilisez le type de géographie. La distance est toujours en mètres :

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

Toutes ces fonctionnalités nécessiteront probablement une version récente de Postgis (2.0+). Je ne suis pas sûr cependant.

Vérifiez ceci pour référence https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/