Đếm các tính năng vào các giao điểm của Đa giác Shapely


13

Tôi có một geopandas GeoDataFrame chứa hàng trăm hình dạng PolygonMultiPolygonhình học. Các đa giác chồng lên nhau ở nhiều nơi. Tôi muốn tạo ra một hình học mới có chứa số lượng bao nhiêu trong số chúng trùng nhau. Một cái gì đó như thế này:

Đếm chồng chéo

Có ai có bất kỳ ý tưởng cho cách tiếp cận này? Tôi thậm chí không thể nhìn thấy một cách.

Cuối cùng, tôi đặc biệt muốn có thể cân các đa giác, để một số đa giác có thể có giá trị bằng 2. Làm điều này với shapelytrường Z có thể tốt.

Ngoài ra: Tôi không đặc biệt bị ràng buộc với bất kỳ thư viện nào trong số này, đó chỉ là nơi tôi đã kết thúc. Các tọa độ trong các hình học này thực sự là tọa độ pixel - Tôi đang vấp phải việc tạo một raster để phủ lên một hình ảnh khác. Tôi muốn giữ dấu chân của mình càng nhỏ càng tốt, vì tôi muốn có thể triển khai công cụ này lên các máy chủ đám mây, v.v., nơi tôi có thể không thể cài đặt các công cụ ngẫu nhiên.


Hãy thử ví dụ này . Bạn có thể phân chia các đa giác cho mỗi giao điểm 1-1 và đếm từng trường hợp, tạo một danh sách trong python để điền vào số đếm và sau đó là bảng thuộc tính.
blu_sr

Mặc dù không có mã bao gồm, nhưng câu trả lời này trên SO mô tả một thuật toán để kiểm tra xem một đa giác có hoàn toàn nằm trong một đa giác khác hay không. Tôi đoán rằng nếu bạn đã kiểm tra ít nhất một giao điểm giữa các phân đoạn dòng thì điều đó sẽ chỉ ra các đa giác chồng chéo.
stevej

Ngoài ra, dường như có một chức năng geopandas GeoSeries.intersects ; Tôi tự hỏi nếu nó hoạt động trên đa giác.
stevej

Bạn có khả năng rasterize chúng? nếu bạn rasterize tất cả chúng để có những cái trong đa giác, thì bạn có thể sử dụng numpy để thêm chúng lại với nhau và mỗi số trong kết quả sẽ cho biết có bao nhiêu đa giác trùng nhau ở pixel đó.
1269942

Câu trả lời:


2

Có thể lạc đề vì đây là giải pháp postgresql / postgis:

Trong postgres / postgis, đó là một truy vấn O (N ^ 2) đơn giản có thể / có thể được chấp nhận để geopanda.

$ psql gis_se;
-- create the postgis extension  
create extension postgis;

-- create a polygon table 
create table test_overlap(id serial primary key);

-- Add the geometry
select addgeometrycolumn('public','test_overlap','geom',4326,'POLYGON',2);
insert into test_overlap(geom) values
(ST_GeomFromEWKT('SRID=4326;POLYGON((-2 -2, -2 -1,-1 -1,-1 -2, -2 -2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((-2 -2, -2 0, 0 0, 0 -2, -2 -2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((2 2, 2 0, 0 0, 0 2, 2 2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((2 2, 2 1,1 1,1 2, 2 2))')),
(ST_GeomFromEWKT('SRID=4326;POLYGON((-1.5 -1.5, -1.5 1.5,1.5 1.5,1.5 -1.5, -1.5 -1.5))'));

và định nghĩa 5 hình chữ nhật:

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

Yêu cầu giao với bảng chính nó:

select a.id, b.id, st_intersects(a.geom, b.geom) 
from test_overlap as a, test_overlap as b 
where a.id<>b.id; 

cho thấy các khu vực giao nhau:

 id | id | st_intersects 
----+----+---------------
  1 |  2 | t
  1 |  3 | f
  1 |  4 | f
  1 |  5 | t
  2 |  1 | t
  2 |  3 | t
  2 |  4 | f
  2 |  5 | t
  3 |  1 | f
  3 |  2 | t
  3 |  4 | t
  3 |  5 | t
  4 |  1 | f
  4 |  2 | f
  4 |  3 | t
  4 |  5 | t
  5 |  1 | t
  5 |  2 | t
  5 |  3 | t
  5 |  4 | t

Sử dụng cơ sở này, bạn có thể tổng hợp số đếm cho từng đối tượng ID thông qua nhóm theo mệnh đề:

select id, count(id)                         
from (select 
       a.id as id, b.id as bid, 
       st_intersects(a.geom, b.geom) as intersects 
       from test_overlap as a, test_overlap as b where a.id<>b.id
) as i
where intersects
group by id
order by id;

Kết quả cho thấy mô hình mong muốn.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
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.