Tôi có bộ dữ liệu quốc gia về điểm địa chỉ (37 triệu) và bộ dữ liệu đa giác về đường viền lũ (2 triệu) loại MultiPolygonZ, một số đa giác rất phức tạp, tối đa ST_NPoints là khoảng 200.000. Tôi đang cố gắng xác định bằng PostGIS (2.18) trong đó các điểm địa chỉ nằm trong đa giác lũ và ghi chúng vào một bảng mới với id địa chỉ và chi tiết rủi ro lũ lụt. Tôi đã thử từ góc độ địa chỉ (ST_Within) nhưng sau đó đổi chỗ này bắt đầu từ phối cảnh vùng lũ (ST_Contains), lý do là có những khu vực rộng lớn không có rủi ro lũ lụt. Cả hai bộ dữ liệu đã được phân bổ lại thành 4326 và cả hai bảng đều có chỉ số không gian. Truy vấn của tôi dưới đây đã chạy được 3 ngày và không có dấu hiệu hoàn thành sớm!
select a.id, f.risk_factor_1, f.risk_factor_2, f.risk_factor_3
into gb.addresses_with_flood_risk
from gb.flood_risk_areas f, gb.addresses a
where ST_Contains(f.the_geom, a.the_geom);
Có cách nào tối ưu hơn để chạy cái này không? Ngoài ra, đối với các truy vấn chạy dài loại này, cách tốt nhất để theo dõi tiến trình ngoài việc xem xét việc sử dụng tài nguyên và pg_stat_activity là gì?
Truy vấn ban đầu của tôi đã hoàn thành OK mặc dù trong 3 ngày và tôi đã bị lãng quên với công việc khác vì vậy tôi không bao giờ phải dành thời gian để thử giải pháp. Tuy nhiên tôi mới truy cập lại cái này và làm việc thông qua các khuyến nghị, cho đến nay vẫn tốt. Tôi đã sử dụng như sau:
- Tạo lưới 50km trên khắp Vương quốc Anh bằng giải pháp ST_FishNet được đề xuất tại đây
- Đặt SRID của lưới được tạo thành Lưới quốc gia Anh và xây dựng một chỉ mục không gian trên đó
- Cắt dữ liệu lũ của tôi (MultiPolygon) bằng ST_Intersection và ST_Intersects (chỉ có Gotcha ở đây là tôi phải sử dụng ST_Force_2D trên geom khi shape2pgsql thêm chỉ mục Z
- Cắt dữ liệu điểm của tôi bằng cách sử dụng cùng một lưới
- Tạo các chỉ mục trên hàng và chỉ mục col và không gian trên mỗi bảng
Tôi đã sẵn sàng để chạy tập lệnh của mình bây giờ, sẽ lặp lại các hàng và cột kết quả vào một bảng mới cho đến khi tôi phủ sóng toàn quốc. Nhưng chỉ cần kiểm tra dữ liệu lũ lụt của tôi và một số đa giác lớn nhất dường như đã bị mất trong bản dịch! Đây là truy vấn của tôi:
SELECT g.row, g.col, f.gid, f.objectid, f.prob_4band, ST_Intersection(ST_Force_2D(f.geom), g.geom) AS geom
INTO rofrse.tmp_flood_risk_grid
FROM rofrse.raw_flood_risk f, rofrse.gb_grid g
WHERE (ST_Intersects(ST_Force_2D(f.geom), g.geom));
Dữ liệu gốc của tôi trông như thế này:
Tuy nhiên bài đăng cắt nó trông như thế này:
Đây là một ví dụ về đa giác "mất tích":