sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgis SQL til nærmeste naboer

For det første, hvis du bruger breddegrad, længdegrad, skal du bruge 4326.

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

Derefter opretter du et indeks på geomfeltet

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

Så 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;

Denne forespørgsel vil drage fordel af kNN-funktionaliteten i hovedindekset (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Alligevel vil den returnerede afstand være i grader, ikke meter (projektion 4326 bruger grader).

Sådan rettes dette:

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 beregner ST_distancen, skal du bruge geografitypen. Der er altid afstand i meter:

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

Al denne funktionalitet har sandsynligvis brug for en nyere Postgis-version (2.0+). Jeg er dog ikke sikker.

Tjek dette for reference https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/



  1. hvordan man indsætter tekstboksværdierne i databasen mysql ved hjælp af php oops-konceptet, når der klikkes på knappen Send

  2. Sådan arbejder du med PL/SQL-arrays eller samlinger som parametre, så JOIN dem sammen ved indeks

  3. Fjern alle mellemrum fra en streng i SQL Server

  4. Læser klump linje for linje med pl\sql