Recuento de entidades en intersecciones de polígonos bien formados

13

Tengo un geopandas que GeoDataFrame contiene cientos de formas Polygony MultiPolygongeometrías. Los polígonos se superponen en muchos lugares. Me gustaría hacer una nueva geometría que contenga un recuento de cuántas de ellas se superponen. Algo como esto:

Contando superposiciones

¿Alguien tiene alguna idea sobre cómo abordar esto? Ni siquiera puedo ver una forma de entrar.

Eventualmente, me gustaría especialmente poder pesar los polígonos, para que algunos polígonos valgan 2 por sí mismos. Hacer esto con shapelyel campo Z de Z podría ser bueno.

Aparte: no estoy particularmente vinculado a ninguna de estas bibliotecas, es justo donde terminé. Las coordenadas en estas geometrías son en realidad coordenadas de píxeles: estoy tropezando con hacer una trama para superponer en otra imagen. Prefiero mantener mi huella lo más pequeña posible, ya que me gustaría poder implementar esto en servidores en la nube, etc., donde es posible que no pueda instalar cosas al azar.

kwinkunks
fuente
Prueba este ejemplo . Puede dividir los polígonos para cada intersección 1 a 1 y contar cada instancia, hacer una lista en python para completar con el número de conteo y luego la tabla de atributos.
blu_sr
Si bien no hay código incluido, pero esta respuesta en SO describe un algoritmo para verificar si un polígono está completamente dentro de otro. Supongo que si verificaras al menos una intersección de línea entre segmentos de línea, eso indicaría polígonos superpuestos.
stevej
También parece haber una función geopandas GeoSeries.intersects ; Me pregunto si funciona en polígonos.
stevej
¿tienes la capacidad de rasterizarlos? si los rasteriza a todos para que tengan unos en los polígonos, puede usar numpy para sumarlos y cada número en el resultado indicará cuántos polígonos se superponen en ese píxel.
user1269942

Respuestas:

2

Puede estar fuera de tema porque es una solución postgresql / postgis:

En postgres / postgis es una simple consulta O (N ^ 2) que puede / podría adoptarse para 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))'));

y define 5 rectángulos:

ingrese la descripción de la imagen aquí

La solicitud de intersección con la tabla misma:

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; 

muestra qué áreas se cruzan entre sí:

 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

Con esta base, puede agregar los recuentos para cada objeto de identificación a través del grupo por clausel:

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;

El resultado muestra el patrón deseado.

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