Suite

Comptage d'entités dans les intersections de polygones profilés


j'ai un géopandaGeoDataFramecontenant des centaines de formesPolygoneetMultipolygonegéométries. Les polygones se chevauchent à de nombreux endroits. J'aimerais créer une nouvelle géométrie contenant le nombre de chevauchements. Quelque chose comme ça:

Quelqu'un a-t-il des idées sur la façon d'aborder cela? Je ne vois même pas le moyen d'entrer.

À terme, j'aimerais surtout pouvoir pondérer les polygones, afin que certains polygones valent 2 à eux seuls. Faire ça avecgalbéLe champ Z de 's pourrait être sympa.

A part : je ne suis pas particulièrement lié à l'une 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 ces éléments sur des serveurs cloud, etc., où je ne pourrai peut-être pas installer des éléments aléatoires.


Peut être hors sujet car il s'agit d'une solution postgresql/postgis :

Dans postgres/postgis, il s'agit d'une simple requête O(N^2) qui peut/pourrait être adoptée pour geopanda.

$ psql gis_se; -- créer l'extension postgis créer l'extension postgis; -- créer une table de polygones créer une table test_overlap(id serial primary key); -- Ajouter la géométrie select addgeometrycolumn('public','test_overlap','geom',4326,'POLYGON',2); insérer dans test_overlap(geom) les valeurs (ST_GeomFromEWKT('SRID=4326;POLYGON((-2 -2, -2 -1,-1 -1,-1 -2, -2 -2))')), (ST_GeomFromEWKT ('SRID=4326;POLYGONE((-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;POLYGONE((2 2, 2 1,1 1,1 2, 2 2))')), (ST_GeomFromEWKT( 'SRID=4326;POLYGONE((-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 :

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

sélectionnez a.id, b.id, st_intersects(a.geom, b.geom) de test_overlap en tant que a, test_overlap en tant que b où a.id<>b.id ;

montre quelles zones se croisent :

identifiant | identifiant | 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 décomptes pour chaque objet ID via le par groupe clausenel :

select id, count(id) from (select a.id as id, b.id as bid, st_intersects(a.geom, b.geom) as recoupe from test_overlap as a, test_overlap as b où a.id<>b. id ) comme i où se coupe groupe par id ordre par id;

Le résultat montre le modèle souhaité.

identifiant | compte ----+------- 1 | 2 2 | 3 3 | 3 4 | 2 5 | 4


Voir la vidéo: AutoGIS 2019 Lesson Point-in-polygon u0026 Intersect, Spatial join (Octobre 2021).