sql >> Databáze >  >> RDS >> PostgreSQL

Postgis SQL pro nejbližší sousedy

Za prvé, pokud používáte zeměpisnou šířku a délku, musíte použít 4326.

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

Poté vytvoříte index v poli geom

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

Pak získáte sousedy 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;

Tento dotaz využije funkci kNN hlavního indexu (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Vrácená vzdálenost bude stále ve stupních, nikoli v metrech (projekce 4326 používá stupně).

Chcete-li to opravit:

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

Při výpočtu ST_distance použijte typ geografie. Vzdálenost je vždy v metrech:

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

Všechny tyto funkce budou pravděpodobně vyžadovat nejnovější verzi Postgis (2.0+). Nejsem si však jistý.

Podívejte se na odkaz https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/



  1. Odešlete formulář CodeIgniter a AJAX

  2. Automatické spouštění dotazu v mysql

  3. Funkce NVL2 v Oracle

  4. Jak získat poslední den v měsíci v MySQL