Xác định các đa giác phạm vi dài và hẹp của hẹp với PostGIS


10

Tôi có một bộ đa giác đại diện cho các khu vực rộng lớn, nói các khu phố. Tôi muốn xác định các khu vực chồng chéo lớn giữa chúng.

Nhưng có một vấn đề: đôi khi các đa giác này sẽ chồng lên nhau dọc theo chu vi của chúng (vì chúng được vẽ với độ chính xác nhỏ). Điều này sẽ tạo ra các lớp phủ dài và hẹp mà tôi không quan tâm.

Nhưng những lần khác sẽ có sự chồng chéo lớn của đa giác mạnh, nghĩa là các khu vực rộng lớn nơi đa giác của một khu phố chồng lên nhau. Tôi chỉ muốn chọn những thứ này.

Xem hình dưới đây chỉ là sự chồng chéo. Hãy tưởng tượng tôi chỉ muốn chọn đa giác màu xanh ở góc dưới bên trái.

chồng chéo

Tôi có thể nhìn vào các khu vực, nhưng đôi khi những khu vực hẹp quá dài, cuối cùng chúng có những khu vực lớn như đa giác màu xanh. Tôi đã cố gắng thực hiện tỷ lệ diện tích / chu vi, nhưng điều đó cũng mang lại kết quả hỗn hợp.

Tôi thậm chí đã thử sử dụng ST_MinimumClearance, nhưng đôi khi các khu vực rộng lớn sẽ có một phần hẹp gắn liền với nó, hoặc hai đỉnh rất gần nhau.

Bất kỳ ý tưởng của phương pháp khác?


Cuối cùng, điều làm việc tốt nhất với tôi là sử dụng bộ đệm âm, như được đề xuất bởi @Cyril và @FGreg bên dưới.

Tôi đã sử dụng một cái gì đó như:

ST_Area(ST_Buffer(geom, -10)) as neg_buffer_area

Trong trường hợp của tôi, đơn vị là mét, vì vậy 10 m đệm âm.

Đối với đa giác hẹp, khu vực này trả về 0 (đồng thời, hình học sẽ trống). Sau đó, tôi đã sử dụng cột này để lọc ra các đa giác hẹp.


4
Chắc chắn tỷ lệ diện tích / chu vi có thể được sử dụng cho việc này.
Vince

Thật khó để biết các đa giác khác biệt từ hình ảnh ở đâu, nhưng làm một cái gì đó như thế này gis.stackexchange.com/a/265233/64838 có thể hoạt động? Tính hộp giới hạn xoay tối thiểu sau đó loại bỏ những cái có chiều rộng hoặc chiều cao nhỏ.
FGreg

Bạn cũng có thể thử sử dụng bộ đệm âm như được mô tả ở đây: Làm cách nào tôi có thể xác định các đa giác thực sự mỏng trong tệp hình dạng của mình?
FGreg

Câu trả lời:


5

Tôi sẽ cố gắng tạo một bộ đệm âm, nếu nó ăn đa giác mỏng thì tốt, nếu nó không ăn đa giác, thì nó là của tôi ... :-)

chạy tập lệnh này, trước đó đã đặt 2/3 chiều rộng của đa giác tuyến tính ...

create table name_table as
SELECT ST_Buffer(
(ST_Dump(
(ST_Union(
ST_Buffer(
(geom),-0.0001))))).geom,
0.0001)) as geom from source_table

HĐH: -) ...


cuối cùng đề nghị của bạn là những gì làm việc tốt nhất cho tôi. Tôi đã kết thúc bằng cách sử dụng một cái gì đó như ST_Area(ST_Buffer(geom, -10)), -10 là -10 mét trong trường hợp của tôi. Nếu bất cứ điều gì trả về 0 từ biểu thức đó thì tôi có thể lọc nó ra.
bplmp

9

Thay vì diện tích / chu vi, tốt hơn là sử dụng diện tích chia cho bình phương của chu vi (hoặc nghịch đảo của nó).

Điều này cũng được gọi là "chỉ số hình dạng". Bình phương của chu vi chia cho diện tích có giá trị tối thiểu là 4 * Pi () (trong trường hợp là đĩa, là hình học 2D nhỏ gọn nhất), do đó có thể dễ dàng chuẩn hóa 4 * Pi () giải thích (giá trị chuẩn hóa gần 1 thì có nghĩa là bạn có các đối tượng rất nhỏ gọn và hình vuông có giá trị xấp xỉ 1,27).

EDIT: Một ngưỡng trên khu vực sẽ hữu ích để loại bỏ các vật phẩm rất nhỏ, có thể nhỏ gọn. Sau đó, chỉ số hình dạng sẽ hiển thị độ tương phản tốt hơn. EDIT: ngoài câu trả lời này, việc sử dụng ST_Snap có thể giúp bạn giải quyết vấn đề trước khi nó xảy ra.


Cảm ơn! Nhưng tôi không chắc làm thế nào ST_Snap có thể giúp đỡ trong trường hợp này ... Nếu tôi hiểu đúng, bạn đang đề xuất một cái gì đó như thế (o.overlap_perimeter^2 / o.overlap_area) / (4 * Pi()) as overlap_rationào? Điều này có kết quả tồi tệ hơn đối với tôi hơn là chỉ diện tích / chu vi.
bplmp

Bây giờ sử dụng o.overlap_perimeter / (4 * sqrt(o.overlap_area)) as overlap_ratiotheo bài báo này, nhưng vẫn cho kết quả tồi tệ hơn (mặc dù khó có thể định lượng được ý tôi nói xấu hơn) isprs-ann-ph photoramm-remote-sens-spatial-inf-sci.net / I-7/135 / / , trang 183.
bplmp

2
Cảm ơn bạn vì điều này, tôi chưa bao giờ nghe nói về "chỉ số hình dạng". Tôi đã luôn nghĩ rằng sử dụng một hình chữ nhật giới hạn tối thiểu là cách tốt nhất để trả lời loại câu hỏi này. Tôi tìm thấy cái này, repository.asu.edu/attachments/111230/content/ , thật thú vị.
John Powell

@JohnPowell xen kẽ giấy, cảm ơn. Tôi thấy rằng những gì tôi biết như một chỉ số hình dạng được gọi là chỉ số vòng tròn trong bài báo. Vấn đề của tôi với các hình chữ nhật giới hạn tối thiểu là nó không hoạt động với các vật thể rất lõm (ví dụ hình chữ U)
radouxju

@bplmp ST_Snap sẽ giúp bạn chụp các đỉnh của đa giác liền kề "gần như" để chúng không bị chồng chéo nữa. Không có thang đo trên các số liệu của bạn, nhưng vật phẩm của bạn trông giống như các đường kẻ, vì vậy tôi đoán rằng bạn có thể sử dụng một giá trị dung sai là đủ để tránh các vật phẩm giả nhưng không ảnh hưởng đến các đa giác lớn.
radouxju

5

Một lựa chọn sẽ là sử dụng tỷ lệ diện tích của đa giác với đường dài nhất có thể được vẽ bằng các điểm cực trị của nó. Xác định đa giác hẹp dài.

select * from polygons where ST_Length(ST_LongestLine(geom, geom)) < ST_Area(geom) * 4

Điều này hoạt động khá tốt cho đa giác cúi. Bạn có thể điều chỉnh tỷ lệ (những gì bạn nhân diện tích với) cho phù hợp với nhu cầu và dự đoán của bạn.


1

Có vẻ như điều này có thể phù hợp với trường hợp sử dụng của bạn: Loại bỏ các đa giác được chọn

Kết hợp các đa giác được chọn của lớp đầu vào với các đa giác liền kề nhất định bằng cách xóa ranh giới chung của chúng. Đa giác liền kề có thể là một đa giác có diện tích lớn nhất hoặc nhỏ nhất hoặc là chia sẻ ranh giới chung lớn nhất với đa giác cần loại bỏ.

Loại bỏ thường được sử dụng để loại bỏ các đa giác cúi, tức là đa giác nhỏ là kết quả của các quá trình giao nhau đa giác trong đó ranh giới của các đầu vào là tương tự nhưng không giống nhau.

Có vẻ như bạn muốn thử tùy chọn "Ranh giới chung lớn nhất".


Tôi nhận ra bây giờ bạn đang yêu cầu giải pháp postgis chứ không phải giải pháp qgis. Tôi xin lỗi, tôi không nghĩ rằng postgis có chức năng tương đương nhưng tôi sẽ để lại cho hậu thế.
FGreg

0

Điều này đối với tôi giống như một trường hợp sử dụng hoàn hảo cho phần mở rộng cấu trúc liên kết của PostGIS . Tham số dung sai của cấu trúc liên kết sẽ xác định khoảng cách bạn cho phép các đỉnh bám vào các đa giác hiện có khác, để đối phó với độ chính xác thấp của dữ liệu nguồn và để làm sạch nó.

Nói tóm lại, chiến lược là:

1. Kích hoạt phần mở rộng cấu trúc liên kết

CREATE EXTENSION postgis_topology;

2. Tạo một cấu trúc liên kết trống mới

SELECT topology.CreateTopology('neighborhoods_topo', 4326, 1e-7);

Tham số thứ ba là dung sai, tính theo đơn vị của CRS; chọn nó một cách khôn ngoan Lý tưởng nhất, bạn muốn có một CRS trong đó đơn vị là mét. Nếu đơn vị CRS không phải là mét, như với WGS 84 aka 4326, hãy sử dụng ST_Transformđể từ chối đa giác của bạn.

3. Thêm cột TopoGeometry vào bảng đa giác

SELECT topology.AddTopoGeometryColumn('neighborhoods_topo', 'public', 'neighborhoods', 'topogeom', 'POLYGON');

Điều này trả về một cái mới layer_id. Lưu nó, nó sẽ cần sau này. Nó sẽ là lớp 1nếu bạn bắt đầu từ đầu, và tăng lên ở mỗi cuộc gọi mới.

4. Thêm tất cả các đa giác vào cấu trúc liên kết

UPDATE public.neighborhoods
SET topogeom = topology.toTopoGeom(geom, 'neighborhoods_topo', 1, 1e-7);

Điều này có thể mất vài giờ cho một tập dữ liệu lớn, hãy kiên nhẫn. 1là layer_id được trả về trước đó.

5. Tìm khuôn mặt xuất hiện ở một số khu phố

Tìm tất cả các khuôn mặt từ cấu trúc liên kết có mặt trong 2 hoặc nhiều topogeometries. Tôi sẽ để lại truy vấn như một bài tập. Dễ nhất có lẽ là với GetTopoGeomElementschức năng, sau đó nhóm theo id khuôn mặt và nhìn vào những cái có số lượng từ 2 trở lên. Ngoài ra, bạn có thể tạo một bảng mới với hình học đã được làm sạch từ cột topogeom, chỉ cần chuyển nó thành hình học tiêu chuẩn topogeom::geometryvà lặp lại những gì bạn đã có bây giờ, nhưng bây giờ với một tập dữ liệu sạch mà không có phần trùng lặp.

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.