Có chức năng hòa tan nào trong PostGIS ngoài st_union không?


22

Tôi đang tìm một hàm để xóa các ranh giới được chia sẻ giữa các tính năng đa giác trong một bảng. ST_UNION () gần như thực hiện những gì tôi đang tìm kiếm, nhưng nó tạo ra một đa giác từ tất cả các đa giác trong lớp bất kể chúng có chia sẻ một ranh giới chung hay không. Tôi chỉ muốn xóa tan ranh giới giữa các đa giác chạm vào nhau. Tôi hình dung, nên có một số cách sử dụng ST_TOUCHES () nhưng sau đó, nhu cầu về hàm hòa tan có vẻ phổ biến đến mức tôi sẽ ngạc nhiên nếu không có chức năng tích hợp để đạt được điều này.

Trường hợp sử dụng trông như thế này: Tôi đã tải xuống dữ liệu Corine Landcover cho một quốc gia lớn ở châu Âu và tôi muốn xóa tan ranh giới giữa các loại rừng khác nhau (khoảng 75.000 đa giác trong một bảng). Tôi đã thử ST_UNION, nhưng nó không thành công với lỗi "hết bộ nhớ" (mặc dù 30.000 đa giác đã hoạt động):

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

Lưu ý: Tất cả các mã rừng bắt đầu bằng '31' và tôi đang sử dụng PostGIS 1.4, phiên bản GEOS: 3.2.0-CAPI-1.6.0

Câu trả lời:


21

ST_MemUnion () sẽ chạy một quy trình thân thiện với bộ nhớ ngây thơ và chậm. Bạn có thể thử điều đó, nếu vấn đề của bạn đủ nhỏ, nó có thể kết thúc trong một khoảng thời gian hợp lý. Bạn cũng có thể chia vấn đề của mình thành một nửa, sau đó chạy các nửa lại với nhau. Vì các kết quả sẽ có ít điểm hơn nhiều so với các đầu vào mà bạn có thể có thể điều chỉnh toàn bộ vấn đề vào bộ nhớ theo cách đó. Hoặc sử dụng thói quen đói bộ nhớ nhanh trên một nửa và thói quen chậm hơn trong lần hợp nhất cuối cùng.


4
Thật tuyệt vời khi có bạn ở đây Paul, cảm ơn vì đã mang đến cho bạn chuyên môn tuyệt vời.
đánh dấu

1
Cảm ơn, có vẻ như vấn đề của tôi không đủ nhỏ. ST_MemUnion () hiện đã chạy được 24 giờ. Tôi sẽ cố gắng phân chia vấn đề.
underdark

5

Tôi tin rằng ST_Dump là những gì bạn muốn:

ST_Dump :

Trả về một tập hợp các hàng hình học_dump (geom, path), tạo thành một hình học g1 .... Ví dụ: nó có thể được sử dụng để mở rộng MULTIPOLYGONS thành POLYGONS. ...

Vì vậy, đối với trường hợp của bạn:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

Tôi không chắc nó sẽ tương tác như thế nào với việc tạo bảng mà bạn đang cố gắng thực hiện, nhưng nó sẽ cung cấp cho bạn hình học dưới dạng các mục riêng biệt. Sau đó, bạn có thể thực hiện nối không gian (sử dụng && và ST_Contains) giữa hai bảng để thu thập dữ liệu trên hình học.


2
Lưu ý: điều này sẽ chỉ hữu ích nếu bạn xử lý các vấn đề về bộ nhớ của ST_Union! :)
yhw42

4

PostGIS của bạn có được biên dịch dựa trên GEOS 3.1.0+ không? Đối với phiên bản đó, một liên minh xếp tầng nhanh hơn nhiều đã được triển khai, nhưng nếu không tìm thấy sẽ sử dụng mã cũ hơn là các lệnh có cường độ chậm hơn.

Cập nhật : có vẻ như PostGIS của bạn đang sử dụng phương pháp liên kết theo tầng, nhưng việc bỏ đói bộ nhớ là có thật. Tôi sẽ thử tăng bộ nhớ khả dụng cho ví dụ Postgres của bạn, đây là một số lời khuyên từ bài nói chuyện FOSS4G PostGIS năm 2007 của Paul Ramsey :

  • Truy cập đĩa chậm, do đó hiệu suất cao hơn có thể đạt được bằng cách sử dụng nhiều bộ nhớ hơn để lưu trữ dữ liệu!
    • Tăng shared_buffers
    • RAM vật lý - Hệ điều hành cần * 75%
  • Sắp xếp nhanh hơn trong bộ nhớ
    • Tăng work_mem
  • Dọn đĩa nhanh hơn với nhiều bộ nhớ hơn
    • Tăng maintenance_work_mem
  • Phân bổ cho mỗi kết nối
  • Cũng thế
    • Tăng wal_buffers
    • Tăng checkpoint_segments
    • Giảm bớt random_page_cost

Trong trường hợp của bạn, tôi sẽ thử tăng shared_buffers, đề xuất chung là 25% bộ nhớ khả dụng của bạn cho máy chủ cơ sở dữ liệu, nhưng hãy thử tăng nó lên 3-4 lần giá trị hiện tại của nó và xem liệu nó có hoàn thành hay không.


postgis_geos_version () trả về: 3.2.0-CAPI-1.6.0 ... Tôi đoán điều đó tốt. Sẽ thử ST_Collect, cảm ơn.
underdark

Chà, ST_Collect dường như không xóa tan mọi ranh giới và nó cũng tạo ra một Đa giác khổng lồ.
underdark

vâng, tôi đã đọc sai trang cho ST_Collect. Tôi đã cập nhật câu trả lời của mình để cung cấp lời khuyên cụ thể hơn để điều chỉnh việc sử dụng bộ nhớ của Postgres.
scw
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.