Menghitung fitur menjadi persimpangan Shapely Polygons

13

Saya memiliki geopanda yang GeoDataFrame berisi ratusan bentuk Polygondan MultiPolygongeometri. Poligon tumpang tindih di banyak tempat. Saya ingin membuat geometri baru yang berisi hitungan berapa banyak dari mereka yang tumpang tindih. Sesuatu seperti ini:

Menghitung tumpang tindih

Adakah yang punya ide untuk mendekati ini? Aku bahkan tidak bisa melihat jalan masuk.

Akhirnya saya terutama ingin dapat menimbang poligon, sehingga beberapa poligon mungkin bernilai 2 sendiri. Melakukan ini dengan shapelybidang Z mungkin bagus.

Selain itu: Saya tidak terlalu terikat dengan salah satu perpustakaan ini, itu hanya di mana saya berakhir. Koordinat dalam geometri ini sebenarnya adalah koordinat piksel - Saya tersandung untuk membuat raster untuk ditindih pada gambar lain. Saya lebih suka untuk menjaga jejak saya sekecil mungkin, karena saya ingin dapat menyebarkan hal ini ke server cloud dll, di mana saya mungkin tidak dapat menginstal hal-hal acak.

kwinkunks
sumber
Coba contoh ini . Anda dapat membagi poligon untuk setiap persimpangan 1-ke-1 dan menghitung setiap contoh, membuat daftar dengan python untuk mengisi dengan jumlah hitungan dan kemudian tabel atribut.
blu_sr
Sementara tidak ada kode dimasukkan, tapi ini jawaban pada SO menggambarkan sebuah algoritma untuk memeriksa apakah satu poligon sepenuhnya dalam yang lain. Saya berasumsi bahwa jika Anda memeriksa setidaknya satu garis-persimpangan antara garis-segmen maka itu akan menunjukkan tumpang tindih poligon.
stevej
Juga tampaknya ada fungsi geopanda GeoSeries.intersects ; Saya ingin tahu apakah ini berfungsi pada poligon.
stevej
apakah Anda memiliki kemampuan untuk merasterisasi mereka? jika Anda meraster semuanya agar memiliki poligon, Anda dapat menggunakan numpy untuk menambahkannya bersama dan setiap angka dalam hasilnya akan menunjukkan berapa banyak poligon yang tumpang tindih pada piksel tersebut.
user1269942

Jawaban:

2

Mungkin di luar topik karena ini adalah solusi postgresql / postgis:

Dalam postgres / postgis, ini adalah kueri O (N ^ 2) sederhana yang dapat / dapat diadopsi ke 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))'));

dan mendefinisikan 5 persegi panjang:

masukkan deskripsi gambar di sini

Permintaan persimpangan dengan tabel itu sendiri:

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; 

menunjukkan area mana yang saling berpotongan:

 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

Dengan menggunakan dasar ini, Anda dapat menggabungkan jumlah untuk setiap objek ID melalui grup dengan klausel:

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;

Hasilnya menunjukkan pola yang diinginkan.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
huckfinn
sumber