Rimuovi i poligoni all'interno di altri poligoni in un dataframe

Aug 23 2020

Dato un dataframe, è possibile trovare poligoni che si trovano all'interno di un altro poligono nello stesso dataframe e rimuoverli in base a una condizione?

Ad esempio, considera il seguente dataframe

                                            geometry          category            
0  POLYGON ((332294.432 2794730.319, 332294.032 2...            A                
1  POLYGON ((332193.232 2794730.719, 332192.832 2...            B                
2  POLYGON ((332271.632 2794731.519, 332271.232 2...            C                
3  POLYGON ((332271.632 2794731.519, 332271.232 2...            C          

Supponiamo che il poligono 3 si trovi all'interno del poligono 2. Poiché sono entrambi di categoria C , vorrei rimuovere il poligono 3. Se fossero di categorie diverse, non farei una rimozione.

C'è un modo per farlo all'interno di geopandas?

Risposte

2 BERA Aug 23 2020 at 00:43

import geopandas as gpd
from itertools import permutations

df = gpd.read_file(r'/home/bera/Desktop/within.shp')
category_field = 'cat'

indices = df.index.to_list()

to_delete = []
for p1, p2 in permutations(indices,2): #https://stackoverflow.com/questions/104420/how-to-generate-all-permutations-of-a-list
    #print(p1, p2)
    if df.iloc[p1][category_field] == df.iloc[p2][category_field] and df.iloc[p1].geometry.within(df.iloc[p2].geometry):
        to_delete.append(p1)

#>>to_delete
#>>Out[18]: [1]

if len(to_delete)>0:
    df = df.drop(df.index[to_delete])