Thực hiện truy vấn hộp giới hạn trong PostGIS? [đóng cửa]


22

Tôi có một bảng PostgreSQL, với gần 2 triệu hàng, với coordinatestrường có độ trễ dài trong biểu mẫu POINT(-73.4938 33.2405).

Giả sử có một chỉ số không gian địa lý trên trường đó, cách hiệu quả nhất, nhanh nhất để chọn tất cả các hàng trong một hộp giới hạn tùy ý là gì?

Hộp giống như SW long-lat: -74.0042 40.7688, NE long-lat: -73.8809 40.7984.


Các tọa độ được lưu trữ của bạn đã có lat-lat hay chúng là lưới (X, Y)?
Martin F

1
Toán học đơn giản sẽ làm ở đây ... Nếu point.x lớn hơn SW.x và nhỏ hơn NE.x và point.y lớn hơn SW.y và nhỏ hơn NE.y cùng một lúc, điểm nằm bên trong MBR. Tôi không biết liệu nó có nhanh hơn sử dụng truy vấn không gian không. Bạn có phiền không?
Michal Zimmermann

@zimmi: Ông không thực sự nhà nước rằng các mục chỉ điểm; chúng có thể là hình học phức tạp.
Martin F

Họ là những chỉ điểm, mặc dù ;-). Chúng tồn tại lâu ở dạng ĐIỂM (-73,4938 33,24059) được lưu dưới dạng WKB.
Avishai

Tôi đã chỉnh sửa Q (và A của tôi) để phản ánh thông tin đó. :-)
Martin F

Câu trả lời:


24

Giả sử các giới hạn hộp giới hạn đã cho nằm trong cùng hệ thống tham chiếu không gian như tọa độ được lưu trữ và bạn biết toán tử không gian nào (giao nhau hoặc chứa bởi) bạn cần:

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)

Ngoài ra, nếu bạn thích âm thanh "chứa" (thay vì "chứa bởi") thì WHEREmệnh đề nên được lật:

WHERE  ST_MakeEnvelope (...)
    ~ -- contains, gets same fewer rows 
    coordinates 

PS: Được đưa ra (bởi OP sau khi đã đăng ở trên) rằng các bản ghi các điểm đơn giản, tôi nghĩ rằng sự khác biệt giữa "giao cắt" và "ngăn chặn" trở nên rất tinh tế, chỉ ảnh hưởng đến các điểm trên các cạnh của hộp giới hạn.


đó là một điểm hay. Chứa sẽ ổn, vì bạn sẽ không thực sự có thể nhìn thấy điểm đánh dấu trên bản đồ nếu nó nằm trên đường biên (có thể là trình duyệt chrome có thể).
Avishai

What's the fastest ...?: OP
Magno C

Lưu ý: &&@dường như không hoạt động khi giao nhau với Hình học đa giác. Trong trường hợp này, sử dụng ST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))hoặc thay thếST_Contains
Alex

4
SELECT ST_Y(the_geom) AS latitude, ST_X(the_geom) as longitude
from units u where the_geom && ST_MakeEnvelope(left, bottom, right, top, 4326)

1
Không cần thiết phải nói 4326 là SRID.
Magno C

2

Rõ ràng, tôi không có đủ điểm để thêm nhận xét nên tôi đang sử dụng Câu trả lời này chỉ để nói rằng tôi đã thử cả ST_MakeEnvel so với toán học so sánh "x> min_x và x <max_x và y> min_y và y <max_y". .. trên ST_MakeEn phong bì trung bình mất 60ms và so sánh toán học mất 155ms trên truy vấn bbox cụ thể của tôi.

Vì vậy, tìm kiếm không gian ST_MakeEn phong bì nên nhanh hơn so với toán học so sánh!


1
Trên thực tế, nếu bạn tạo các chỉ mục đúng min_x, max_x, min_y và max_y sẽ nhanh hơn nhiều. Tôi có một bộ dữ liệu rất lớn (hơn 3 triệu đa giác) và đã thực hiện INDEXtrên cả ST_MakeEn phong bì và (ST_XMax, ST_XMin, ST_YMax, ST_YMin) và sự khác biệt này rất có lợi cho toán học. Toán học chỉ mất chưa đến 20 giây (INDEX + Truy vấn) trong khi giao lộ Phong bì mất hơn 2 phút (tôi đã bỏ cuộc khi đạt 2 phút, chỉ 40
giây
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.