Tham gia nhiều đa giác nhỏ để tạo thành đa giác lớn hơn bằng PostGIS?


47

Tôi có lớp sau bằng SRID 27700 trong postgis:

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

Đó là mọi khu vực hành chính ở Anh và (như bạn có thể thấy từ nhóm màu), mỗi khu vực đều có một trường văn bản chỉ định quận mà họ nằm.

Những gì tôi muốn làm là tạo ra các đa giác hạt lớn hơn từ các hạt nhỏ hơn trong một hạt nhất định, do đó, trong hình trên tất cả các đa giác màu teal sẽ tạo thành một đa giác lớn từ vòng ngoài duy nhất chứa tất cả các polys trong đó màu sắc, như khôn ngoan tất cả các màu tím, nâu, hồng, xám, v.v ... nên tạo thành một đa giác.

Tôi đã thử như sau:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

Nhưng nó tiếp tục tạo ra các hình học bị hỏng mà sau đó tôi gặp vấn đề lớn khi xử lý thêm.

Tôi đang cố gắng tạo một bản đồ cấp quận đơn giản hơn với các khu vực đầu ra chính.

Bất kỳ giải pháp nào cũng không phải có trong Postgis, tôi đã cài đặt ngăn xếp OS4Geo đầy đủ, phiên bản mới nhất của QGis và nhiều tiện ích hơn tôi có thể lắc.

Điều duy nhất tôi không có là những ông lớn như ArcGis (Mặc dù tôi có thể có một Mapinfo cũ nằm ở đâu đó)


Đối với bản ghi, tập dữ liệu tôi đang cố gắng tạo là để đi kèm với một cuốn sách GIS tôi đang viết nhằm vào các lập trình viên .NET muốn viết các ứng dụng GIS bằng .NET


Sau khi thử các đề xuất dưới đây, giải pháp tốt nhất là giải pháp 'Paul Ramcoat'.

Bây giờ tôi có một tập tin quận và quận đơn giản hóa, đủ đơn giản cho cuốn sách của tôi, nhưng đủ phức tạp để cho phép tôi trình bày một số SQL không gian địa lý thú vị.

Mặc dù giải pháp của Paul cuối cùng là giải pháp phù hợp với tôi, tôi cũng đã rút ra những câu trả lời khác cho những việc như đơn giản hóa bản đồ đa giác và giảm độ phức tạp hơn nữa.

Tuy nhiên, điều tôi đã quan sát được khi thực hiện điều này, trong khi ST_Collect thực sự nhanh hơn ST_Union, chạy để chạy nó cũng là người chịu trách nhiệm chính cho hình học bị hỏng. Tôi đoán là tăng tốc độ có được với chi phí ít chính xác hơn trong chức năng cốt lõi.


Quá trình này được gọi là "hòa tan". Tôi không có kinh nghiệm với PostGIS, nhưng tôi tin rằng bạn có thể sử dụng lệnh ST_Union để thực hiện việc giải thể.
dmahr

Xin chào dmahr, cảm ơn bạn đã làm rõ, không chắc nó được gọi là gì, tuy nhiên nếu bạn đọc câu hỏi của tôi, bạn sẽ thấy tôi đã thử nó :-)
Shawty

Rất tiếc, xin lỗi ... đã không thấy điều đó. Bạn đã thử câu lệnh chọn mà không có astext(multi())phần? Tôi chỉ đi ra khỏi những gì tôi thấy trong các ví dụ hòa tan PostGIS khác.
dmahr

Chưa, sẽ thử nó ngay bây giờ. Tks. Bạn có liên kết cho các ví dụ hòa tan?
choàng

Vui lòng chỉnh sửa để thể hiện nếu bạn muốn "vòng ngoài duy nhất" hay không. (xem câu trả lời của tôi)
Peter Krauss

Câu trả lời:


43

ST_Union sẽ hoạt động, nhưng công việc của bạn gần như không được đảm bảo. Vì vậy, ranh giới của những điều nhỏ bé của bạn không hoàn toàn thích lên. Bạn có thể nhẹ nhàng chụp chúng vào lưới để thử và tăng tỷ lệ cược mà các đỉnh sắp xếp, nhưng tôi cá rằng bạn vẫn sẽ có một vài trường hợp không hoạt động. Hoặc chúng sẽ vượt quá khả năng chịu đựng hoặc, nhiều khả năng, sẽ có những nơi mà các đỉnh không được ghép nối, do đó, có một đường ở một bên và một đỉnh ở phía bên kia.

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

Nếu bạn có PostGIS 2.0, việc xây dựng cấu trúc cấu trúc liên kết với dung sai có thể đưa bạn đến câu trả lời mà bạn đang tìm kiếm, nếu bạn gặp may mắn.


Đầu mối tốt để chỉnh sửa hình học, nhưng về "... một đa giác lớn từ vòng ngoài duy nhất chứa tất cả các polys ..."?
Peter Krauss

Tôi không biết về 'SnapTo' Tôi sẽ thử :-) Tks. Thật không may, không, chưa sử dụng PG 2, việc nâng cấp đang được thực hiện.
choàng

Không chắc cú pháp của bạn là chính xác. Mỗi postgis.net/docs/ST_Union.html , không có chữ ký nào chấp nhận một số trong tham số thứ 2.
Aren Camename

Bạn nói đúng, dấu ngoặc đơn ở sai vị trí. Đã chỉnh sửa.
Paul Ramsey

Có một mysql tương đương với điều này? Tôi tiếp tục nhận Incorrect parameter count in the call to native function 'ST_Union'và tôi không biết nếu đó là một giới hạn mysql.
Jayen

7

Bạn nói rằng cần phải "... tạo thành một đa giác lớn từ vòng ngoài duy nhất chứa tất cả các polys ...". ST_Ex thầmRing làm điều này,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

Bạn có thể sử dụng ST_Union (), như được đề xuất hoặc kiểm tra với ST_Collection ().


GHI CHÚ: để tránh các vòng lặp nhỏ hoặc "hình học bị hỏng", bạn có thể sử dụng st_convexhull và / hoặc ST_Simplify cho mỗi geom,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

và kiểm tra hình học của bạn,

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 

Xin lỗi vì sự nhầm lẫn: Ý tôi muốn nói trong phần mô tả của tôi là một đa giác lớn hơn được tạo ra từ những cái nhỏ hơn, tôi nhận ra rằng tùy thuộc vào ngữ cảnh 'Vòng ngoài' có thể có ý nghĩa khác nhau với những người khác nhau, ý định của tôi là mô tả một đa giác duy nhất được tạo ra từ ranh giới hiện diện xung quanh mỗi nhóm đa giác.
choàng

7

Hàm ST_Collect là một hàm "tổng hợp" theo thuật ngữ của PostgreQuery

" SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN" sẽ trả về một GEOMETRYCOLLMENT riêng cho từng giá trị riêng biệt của ATTRCOLUM

http://postgis.net/docs/ST_Collect.html

Lưu ý: ST_Collect nhanh hơn ST_Union


3
Tôi đã thử điều đó và nhận được kết quả hơi khác nhau, tuy nhiên một bộ sưu tập hình học tôi cần gì? Tôi chủ yếu cố gắng để làm một đa giác lớn, tùy chọn với lỗ hổng trong nó (Cụ thể ở Derbyshire & Nottinghamshire nơi cả hai trận derby & Nottingham thành huyện riêng biệt ngay trong trung tâm tôi đã quan sát sự khác biệt tốc độ tuy nhiên, do đó, thats kewl..
Shawty

2

Tôi giả sử từ câu hỏi của bạn rằng bạn đang sử dụng sản phẩm Boundary-Line của OrDNance Survey. Nếu đó là trường hợp thì nó đã bao gồm một tập dữ liệu cấp Quận, do đó không cần phải tự tạo ra nó từ các khu vực giáo xứ cấp thấp hơn.

Nếu bạn không sử dụng Boundary-Line thì tôi khuyên bạn nên làm vì nó miễn phí theo giấy phép OS OpenData và có cấp Quận dưới dạng tệp hình dạng mà bạn có thể tải trực tiếp vào PostGIS.


2
Làm thế nào về việc cung cấp một liên kết cho những người không biết nó? cảm ơn.
jonatr

1
Xin chào CHEnderson bạn thực sự đúng, vâng tôi đang sử dụng bộ dữ liệu lớp ranh giới từ OS Opendata, tiếc là ranh giới quận không hoàn chỉnh, tệp hình dạng của Quận thực tế chỉ bao gồm những tệp được đặt tên là các hạt, các quận của Luân Đôn chứa các khu vực xung quanh London và các tệp khác đều có một số phần, một số cấp thấp hơn và nhỏ hơn các phần khác. Tệp duy nhất có toàn bộ phác thảo của Vương quốc Anh, và sau đó bất kỳ cơ hội nào để trích xuất tất cả các quận cấp trên và ranh giới thành phố trong một lớp là lớp giáo xứ, do đó tôi cố gắng làm như vậy.
choàng

Đối với những người quan tâm, bạn có thể tải xuống các ranh giới của quận và hơn thế nữa, ngay tại đây: ordnancesurvey.co.uk/oswebsite/products/os-opendata.html
Shawty
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.