PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgis SQL cho những người hàng xóm gần nhất

Đầu tiên, nếu bạn đang sử dụng vĩ độ, kinh độ, bạn cần sử dụng 4326.

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

Sau đó, bạn tạo một chỉ mục trên trường địa lý

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

Sau đó, bạn nhận được neightbors 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;

Truy vấn này sẽ tận dụng chức năng kNN của chỉ mục gist ( http:// workshop. bindlessgeo.com/postgis-intro/knn.html ).

Tuy nhiên, khoảng cách được trả về sẽ tính bằng độ, không phải mét (phép chiếu 4326 sử dụng độ).

Để khắc phục điều này:

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

Khi bạn tính toán ST_distance, hãy sử dụng kiểu địa lý. Khoảng cách luôn tính bằng mét:

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

Tất cả chức năng này có thể sẽ cần một phiên bản Postgis gần đây (2.0+). Tôi không chắc lắm.

Kiểm tra thông tin này để tham khảo https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nethers-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. Số học cột ngày trong truy vấn PostgreSQL

  2. Group_concat tương đương trong postgresql 8.2.11

  3. Vấn đề với liên kết json JOOQ

  4. Tìm kiếm có dấu + không phân biệt chữ hoa chữ thường PostgreSQL

  5. PostgreSQL - Người dùng DB chỉ được phép gọi các hàm