sql >> Database >  >> RDS >> PostgreSQL

Postgis SQL voor naaste buren

Ten eerste, als je breedtegraad en lengtegraad gebruikt, moet je 4326 gebruiken.

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

Vervolgens maakt u een index op het geom-veld

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

Dan krijg je de kNN buren:

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

Deze query maakt gebruik van de kNN-functionaliteit van de gist-index (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Toch zal de geretourneerde afstand in graden zijn, niet in meters (projectie 4326 gebruikt graden).

Om dit op te lossen:

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

Wanneer u de ST_distance berekent, gebruikt u het type geografie. De afstand is altijd in meters:

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

Voor al deze functionaliteit is waarschijnlijk een recente Postgis-versie (2.0+) nodig. Ik weet het echter niet zeker.

Controleer dit voor referentie https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/



  1. Hoe kan ik now() in Doctrine 2 DQL gebruiken?

  2. Mysqli naar PDO conversie

  3. ROWID (orakel) - enig nut voor?

  4. MYSQL Left Join hoe selecteer ik NULL-waarden?