PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgis SQL за най-близките съседи

Първо, ако използвате географска ширина, дължина, трябва да използвате 4326.

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

След това създавате индекс в полето geom

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

След това получавате 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;

Тази заявка ще се възползва от функционалността на kNN на основния индекс (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).

Въпреки това върнатото разстояние ще бъде в градуси, а не в метри (проекция 4326 използва градуси).

За да коригирате това:

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

Когато изчислявате ST_distance, използвайте географския тип. Там разстоянието винаги е в метри:

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

Цялата тази функционалност вероятно ще се нуждае от скорошна версия на Postgis (2.0+). Не съм сигурен обаче.

Проверете това за справка https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкнете множество ENUM стойности в PostgreSQL

  2. PostgreSQL процедурния език C не е намерен

  3. Heroku - ActionView::Template::Error (PG::Error:ERROR:колона category_products.desc не съществува

  4. Автоматизиране на одитите на сигурността за PostgreSQL

  5. Непрекъснато вмъквайте всички срещани уникални комбинации от три идентификатора