Làm cách nào tôi có thể tối ưu hóa một điểm trong truy vấn Đa giác cho hàng triệu điểm khi hầu hết các điểm nằm trong đa giác?


8

Tôi có 150 triệu điểm trong một bảng điểm và muốn tìm một vài điểm nằm ngoài hình học đa giác đã cho. Tôi biết rằng 99,9% số điểm nằm trong hình dạng đa giác. Tôi quan tâm đến việc tìm kiếm một vài điểm nằm ngoài đa giác.

Truy vấn tốt nhất hiện tại của tôi bằng cách sử dụng các bảng PostGIS được lập chỉ mục mất khoảng 30 phút để hoàn thành. Có cách nào để tối ưu hóa truy vấn sau đây khi biết rằng hầu hết các điểm nằm trong đa giác (viền) không?

SELECT COUNT(*) 
FROM italy_points pt
JOIN borders poly
ON ST_WITHIN (pt.the_geom, poly.geom)
WHERE poly.iso3 = 'ITA'; 

Đa giác về cơ bản là đường viền quản trị 0 của Ý. Đỉnh - 405.000. Bộ phận - 510. Phong bì lớn hơn nhiều so với đa giác (Đa giác chiếm 24% phong bì)


2
Vui lòng Chỉnh sửa câu hỏi để đưa ra dấu hiệu về độ phức tạp của đa giác - Có bao nhiêu phần? Có bao nhiêu đỉnh? Bao nhiêu phần trăm đường bao của đa giác nằm trong đa giác. Tôi đã thấy rằng phân vùng đa giác phức tạp có thể cải thiện việc đánh giá đa giác điểm , nhưng bạn cần xử lý điều kiện trong đó một điểm giao nhau nhiều hơn một phân vùng.
Vince

Tối ưu hóa đầu tiên cho loại hoạt động này thường là để kiểm tra xem điểm có nằm trong hộp giới hạn của đa giác hay không trước khi thực hiện thao tác điểm đa giác đầy đủ. Point-in-box là một hoạt động rất hiệu quả bằng cách so sánh.
WhiteboxDev

@Vince Nếu có thể trùng lặp (trường hợp duy nhất tôi nghĩ là khi nó rơi chính xác vào biên của hai phân vùng), thì điều này được xử lý một cách tầm thường trong PostGIS. Bạn chỉ cần GROUP BYkhóa chính của các điểm. (PostgreSQL thuận tiện cho phép bạn tham chiếu bất kỳ cột nào trong SELECTmệnh đề xuất phát từ bảng có khóa chính được bao gồm trong GROUP BYmệnh đề.)
jpmc26

@WhiteboxDev ST_Withinđã thực hiện kiểm tra hộp ranh giới cho phép sử dụng chỉ mục. (Hầu như tất cả các chức năng của PostGIS đều bao gồm tối ưu hóa này.) Nếu vẫn còn chậm, thì rõ ràng vấn đề là do sự phức tạp của đa giác.
jpmc26

@ jpmc26 Chắc chắn, nhưng truy vấn SQL cũng cần phải được sửa đổi để sử dụng ST_Intersects, vì ST_Withinsẽ không phù hợp với các điều kiện biên nội bộ.
Vince

Câu trả lời:


10

Sử dụng ST_Subdivide để cắt đa giác của bạn thành các đa giác nhỏ hơn, lưu chúng vào bảng và tạo một chỉ mục không gian. Sau đó, thực hiện truy vấn của bạn trên các đa giác lưới.

Không có điều đó, lập chỉ mục không gian không cung cấp bất kỳ lợi thế nào trong trường hợp của bạn (chỉ có 1 đa giác quan tâm).


4
Hơn nữa với nhận xét ST_Subdivide (), bạn có thể thấy rằng sử dụng ít hơn số đỉnh mặc định sẽ mang lại lợi ích hơn nữa bằng cách tăng đòn bẩy chỉ số và giảm thời gian phục hồi hình học. Hãy thử 64 hoặc thậm chí 32.
Paul Ramsey

Truy vấn hiện hoàn thành sau 5 phút so với 30! Cám ơn vì sự gợi ý.
Prithvi

Wow, đây là một tiếng hét cực kỳ tốt. Truy vấn của tôi đã làm sập một máy có RAM 62Gb trong vòng chưa đầy 2 phút và sau đó ST_Subdivide này khiến nó không những không bị sập mà còn thực thi trong vài giây. Chỉ cần tìm người bạn thân mới của tôi!
Momchill
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.