Conteggio delle caratteristiche nelle intersezioni di Shapely Polygons


13

Ho un geopandas GeoDataFrame contenente centinaia di formosePolygon e MultiPolygongeometrie. I poligoni si sovrappongono in molti punti. Vorrei creare una nuova geometria che contasse il numero di quanti si sovrappongono. Qualcosa come questo:

Conteggio delle sovrapposizioni

Qualcuno ha qualche idea su come affrontare questo? Non riesco nemmeno a vedere un modo per entrare.

Alla fine mi piacerebbe soprattutto essere in grado di pesare i poligoni, in modo che alcuni poligoni possano valerne 2 da soli. Farlo con shapelyil campo Z potrebbe essere utile.

A parte: non sono particolarmente legato a nessuna di queste librerie, è proprio dove sono finito. Le coordinate in queste geometrie sono in realtà coordinate di pixel - sto inciampando nel fare in modo che un raster si sovrapponga a un'altra immagine. Preferirei mantenere il mio footprint il più piccolo possibile, dal momento che mi piacerebbe essere in grado di distribuire queste cose su server cloud ecc., Dove potrei non essere in grado di installare cose casuali.


Prova questo esempio . Puoi dividere i poligoni per ogni intersezione da 1 a 1 e contare ogni istanza, creare un elenco in Python per popolare con il numero di conteggio e quindi la tabella degli attributi.
blu_sr,

Sebbene non sia incluso alcun codice, ma questa risposta su SO descrive un algoritmo per verificare se un poligono è interamente all'interno di un altro. Presumo che se si verificasse almeno un'intersezione di linea tra segmenti di linea, ciò indicherebbe poligoni sovrapposti.
stevej,

Inoltre sembra esserci una funzione geopandas GeoSeries.intersects ; Mi chiedo se funzioni sui poligoni.
Stevej,

hai la possibilità di rasterizzarli? se li rasterizzi tutti per averne uno nei poligoni, puoi quindi usare numpy per sommarli e ogni numero nel risultato indicherà quanti poligoni si sovrappongono in quel pixel.
user1269942

Risposte:


2

Potrebbe essere fuori tema perché è una soluzione postgresql / postgis:

In postgres / postgis è una semplice query O (N ^ 2) che può / potrebbe essere adottata per la 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))'));

e definisce 5 rettangoli:

inserisci qui la descrizione dell'immagine

La richiesta di intersezione con la tabella stessa:

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; 

mostra quali aree si intersecano:

 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

Utilizzando questa base è possibile aggregare i conteggi per ciascun oggetto ID tramite il gruppo per clausola:

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;

Il risultato mostra il modello desiderato.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.