Tạo đa giác từ các dòng trong PostGIS


13

Tôi đang cố gắng phân chia một đa giác trong các đa giác nhỏ hơn từ một dòng, nhưng tôi nghĩ rằng tôi không thể sử dụng hàm st_split. Những gì tôi cần là tạo ra các đa giác nhỏ bên trong một cái lớn, sử dụng lưới linestring.

Tôi đã thử một số cách, nhưng tôi không thể nhận được kết quả. Những gì tôi đã thử:

Chia một đa giác từ LineString bằng st_split ()

Từ một đa giác biên.

nhập mô tả hình ảnh ở đây

Và bảng Linestring:

nhập mô tả hình ảnh ở đây

Tôi cần các đa giác sau:

nhập mô tả hình ảnh ở đây

Vấn đề : Tôi không thể tách một đa giác từ nhiều dòng, không phải là đa giác từ đa tuyến.

Phương pháp khác tôi đang thử là tạo đa giác từ các dòng với st_polygonize () SQL tôi đang thử là:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Trích xuất từ Tạo đa giác từ các phân đoạn dòng bằng PostgreSQL và PostGIS

Vấn đề : Tôi chỉ có thể nhận được một đa giác (ranh giới).

Ai đó có thể cho tôi biết đó sẽ là cách tốt nhất để có được các đa giác từ dòng dõi, hoặc nếu tôi thiếu một cái gì đó?

Lưu ý: Các bảng nằm trong cùng SRID và hình học được chia thành một lưới. Trong QGIS tôi có thể chạy quy trình đa giác từ các dòng thành đa giác một cách hoàn hảo.

Theo yêu cầu của John, đây là bảng xếp hàng. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=shaming


1
Bạn có thể đăng hình học linestring ở đâu đó? ST_Polygonize cùng với ST_Dump sẽ hoạt động.
John Powell

Chắc chắn rồi. Tôi đã chỉnh sửa bài đăng với liên kết đến bảng.
Pablo Pardo

@ JohnPowellakaBarça bạn có thể xem cái này. Câu hỏi này rất hay. ST_Polygonize trên tập mẫu của anh ta trả về một đa giác đơn. Về cơ bản chúng ta cần phải phân hủy mớ hỗn độn của LINE LINE và tìm tất cả chúng có thể tạo ra hình chữ nhật?
Evan Carroll

1
@EvanCarroll. Chắc chắn rồi. Tôi đang bận rộn điên cuồng, vì vậy có lẽ không phải trong vài ngày.
John Powell

1
@ppardoz. Espero que esto te ayude. Tôi nhận thấy rằng các bảng của bạn đều bằng tiếng Tây Ban Nha :-)
John Powell

Câu trả lời:


4

Tôi đã làm việc này bằng cách sử dụng ST_Node trước, kết hợp với ST_Collect , để chuyển đổi các dòng thành một tập hợp các chuỗi được gật đầu trong MultiLinestring .

Như đã nói trong các tài liệu cho ST_Node :

Nút đầy đủ một tập hợp các linestrings bằng cách sử dụng số lượng nút ít nhất có thể trong khi bảo toàn tất cả các nút đầu vào.

Điều này có nghĩa là, tất cả các linestrings được kết hợp trong tất cả các kết hợp có thể, để tạo thành tương đương với vòng bên ngoài của một đa giác. Trong khi đó, nếu bạn cố gắng ST_Polygonize một tập hợp LineStrings , thì không ai trong số đó tự mô tả một đa giác, bạn chỉ cần lấy lại LineStrings. Vì vậy, điều này hoạt động:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Nếu bạn chỉ chạy phần đầu tiên của phần này, nghĩa là đa CTE, đầu ra trông như sau:

ĐA NĂNG ((204,5 69,9000000000004,204,5 69,9000000000004), (204,5 68,9,205,4 68,9), (204,5 68,9,204,5 69,204,5 69,1,204,5 69,2,204,5 69,3,204,5 69,4,204,5 69,5,20,5 204,5 69,9000000000004), (209,5 68,9,209,5 68,8,209,5 68,7,209,5 68,6,209,5 68,5,209,5 68,4,209,5 68,3,209,5 68,2,209,5 68,1,209,5 68,209,5 67,9,209,5 67,5,209,5 67,39,5 , 209,5 .......

Bây giờ, khi bạn cung cấp MultiLinestring này cho ST_Polygonize, nó hoạt động như mong đợi, ví dụ:

POLYGON ((205,4 68,9,204,5 68,9,204,5 69,204,5 69,1,204,5 69,2,204,5 69,3,204,5 69,4,204,5 69,5,204,5 69,6,204,5 69,7,204,5 69,8,204,5 69,9,204,5 69,9000000004,44,5,44,5

POLYGON ((204,5 69,9000000000004,204,5 70,204,5 70,1,204,5 70,2,204,5 70,3,204,5 70,4,206.8 70,4,209,5 70,4,209,5 70,3,209,5 70,2,209,5 70,1,209,5 70,209,5 69,9,20,5)

POLYGON ((206,8 70,4,204,5 70,4,204,5 70,5,204,5 70,6,204,5 70,7,204,5 70,8,204,5 70,9,204,5 71,204,5 71,1,204,5 71,2,204,5 71,3,204,5 71,4,204,8

Rõ ràng, ST_AsText chỉ mang tính minh họa và bạn sẽ phải điều chỉnh, nếu bạn cũng muốn ID đường dẫn.

Điểm đáng chú ý là ST_Polygonize mong đợi các linestrings đã mô tả đường viền của đa giác , đó là những gì ST_Node (ST_Collect (.... thực hiện ở trên.


Điều đó thật tuyệt, tôi có thể xác nhận rằng giải pháp này hoạt động! Mặt khác, tôi tự hỏi tại sao ST_Polygonize()nói rằng nó cần các chuỗi dòng, hoặc trường hợp sử dụng là gì mà không gọi ST_Node()trước
Evan Carroll

1
@EvanCarroll. Tôi nghĩ rằng câu trả lời là ST_Polygonize lấy Linestrings đã có trong một tập hợp đại diện cho một đa giác, trong khi các linestrings trong câu hỏi này tạo thành nhiều đa giác có thể. Hiểu biết của tôi là đây là những gì ST_Node làm. Tôi sẽ cố gắng điều tra thêm và cập nhật câu trả lời.
John Powell
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.