Compter les entités dans les intersections de polygones galbés

13

J'ai geopandas GeoDataFrame contenant des centaines de galbe Polygonet MultiPolygongéométries. Les polygones se chevauchent à de nombreux endroits. Je voudrais créer une nouvelle géométrie qui contienne le nombre de chevauchements. Quelque chose comme ça:

Compter les chevauchements

Quelqu'un at-il des idées sur la façon d'aborder cela? Je ne vois même pas de chemin.

Finalement, j'aimerais surtout pouvoir pondérer les polygones, de sorte que certains polygones puissent valoir 2 par eux-mêmes. Faire cela avec shapelyle champ Z pourrait être bien.

À part: je ne suis pas particulièrement lié à aucune de ces bibliothèques, c'est juste là où je me suis retrouvé. Les coordonnées dans ces géométries sont en fait des coordonnées de pixels - je trébuche vers la création d'un raster à superposer sur une autre image. Je préférerais garder mon empreinte aussi petite que possible, car j'aimerais pouvoir déployer ce truc sur des serveurs cloud, etc., où je ne pourrais peut-être pas installer des trucs aléatoires.

kwinkunks
la source
Essayez cet exemple . Vous pouvez diviser les polygones pour chaque intersection 1-à-1 et compter chaque instance, faire une liste en python à remplir avec le numéro de comptage puis la table attributaire.
blu_sr
Bien qu'il n'y ait pas de code inclus, mais cette réponse sur SO décrit un algorithme pour vérifier si un polygone est entièrement dans un autre. Je suppose que si vous avez vérifié au moins une intersection de lignes entre des segments de ligne, cela indiquerait des polygones qui se chevauchent.
stevej
Il semble également y avoir une fonction géopandas GeoSeries.intersects ; Je me demande si cela fonctionne sur des polygones.
stevej
avez-vous la possibilité de les pixelliser? si vous les pixellisez tous pour en avoir un dans les polygones, vous pouvez ensuite utiliser numpy pour les ajouter ensemble et chaque nombre dans le résultat indiquera combien de polygones se chevauchent à ce pixel.
user1269942

Réponses:

2

Peut être hors sujet car c'est une solution postgresql / postgis:

Dans postgres / postgis, c'est une simple requête O (N ^ 2) qui peut / pourrait être adoptée pour la géopanda.

$ 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))'));

et définit 5 rectangles:

entrez la description de l'image ici

La demande d'intersection avec la table elle-même:

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; 

montre quelles zones se croisent:

 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

En utilisant cette base, vous pouvez agréger les nombres pour chaque objet ID via le groupe par 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;

Le résultat montre le motif recherché.

 id | count 
----+-------
  1 |     2
  2 |     3
  3 |     3
  4 |     2
  5 |     4
huckfinn
la source