sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgis SQL för närmaste grannar

Först, om du använder latitud, longitud, måste du använda 4326.

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

Sedan skapar du ett index på geomfältet

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

Då får du kNN-neightbors:

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

Den här frågan kommer att dra nytta av kNN-funktionaliteten i huvudindexet (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Fortfarande kommer det returnerade avståndet att vara i grader, inte meter (projektion 4326 använder grader).

Så här fixar du detta:

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

När du beräknar ST_distance använd geografitypen. Avståndet är alltid i meter:

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

All denna funktionalitet kommer förmodligen att behöva en ny Postgis-version (2.0+). Jag är dock inte säker.

Kontrollera detta för referens https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/



  1. Hur man ansluter till en MySQL- eller MariaDB-databas

  2. Problem när man jämför resultatet av to_char(myDate, 'DAY') med en sträng

  3. MYSQL:Skillnaden mellan Binary och Blob

  4. Åtkomst till det andra elementet i varray-kolumnen