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

Làm cách nào để truy vấn tất cả các hàng trong bán kính 5 dặm tính từ tọa độ của tôi?

Bạn muốn "tất cả các hàng trong bán kính 5 dặm của một tọa độ" , vì vậy đây không phải là không chính xác là một vấn đề K-hàng xóm gần nhất (KNN). Có liên quan, nhưng trường hợp của bạn đơn giản hơn. "Tìm 10 hàng gần nhất với tọa độ của tôi" sẽ là một vấn đề của KNN.

Chuyển đổi tọa độ của bạn thành geography giá trị:

ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography

Ngoài ra, bạn có thể sử dụng geometry đơn giản hơn gõ phím. Xem xét:
4.2.2. Khi nào sử dụng kiểu Dữ liệu địa lý trên kiểu dữ liệu Hình học

Sau đó, chúng ta có một bảng như sau:

CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);

Tất cả những gì bạn cần là ST_DWithin() - và chỉ mục không gian để làm cho nó nhanh chóng:

CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);

Truy vấn:

SELECT *, ST_Distance(c.x, geog) AS distance  -- distance is optional
FROM   tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE  ST_DWithin(c.x, geog, 8045)  -- distance in meter
ORDER  BY distance; -- order is optional, you did not ask for that

Hoặc bạn có thể sử dụng các cột ban đầu của mình và tạo chỉ mục chức năng ... Điều này và các chi tiết khác trong câu trả lời có liên quan chặt chẽ này trên dba.SE:

  • Đặt hàng theo khoảng cách


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm phạm vi ngày trùng lặp trong PostgreSQL

  2. Làm thế nào để chuyển đổi cơ sở dữ liệu postgres sang sqlite

  3. Postgres:lệnh chân không không làm sạch các bộ giá trị đã chết

  4. Làm thế nào để cài đặt postgres với NSIS với tất cả các tham số?

  5. Không có hàm nào phù hợp với các loại đối số và tên đã cho