Suite

Supprimer les îles et les polygones complètement entourés après la polygonisation avec QGIS

Supprimer les îles et les polygones complètement entourés après la polygonisation avec QGIS


J'ai un plan des bâtiments d'une ville. J'ai pu polygoniser correctement les bâtiments dans QGIS avec l'algorithme de traitement Polygonize. Tous les trous/îles sont devenus des caractéristiques comme prévu. Maintenant, je dois sélectionner et supprimer toutes les fonctionnalités qui sont complètement entourées par d'autres (une ou plusieurs) fonctionnalités. Exemples affichés en rouge sur l'image :
Ceux-ci ne font pas partie des bâtiments, mais des cours intérieures.


une alternative consiste à utiliser « vecteur > outils de géotraitement > dissoudre » (--Dissoudre tout-- dans la liste des champs de dissolution), puis sélectionnez les polygones qui sont "à l'intérieur" des polygones dissous à l'aide du plugin "requête spatiale".


Vous pouvez utiliser par exemple ce script python pour mettre en évidence ou supprimer les fonctionnalités qui se trouvent complètement dans une autre fonctionnalité.

layer = iface.activeLayer() #ou le calque que vous souhaitez utiliser features_a = layer.getFeatures() features_b = [feat pour feat dans layer.getFeatures()] within_list = list() pour feat_a dans features_a : pour feat_b dans features_b : if feat_b.id() != feat_a.id() : if feat_b.geometry().within(feat_a.geometry()) : within_list.append(feat_b.id())

Pour mettre en évidence les fonctionnalités que vous pouvez utiliser :

layer.setSelectedFeatures(within_list)

Et pour supprimer les fonctionnalités mises en évidence, utilisez :

caps = layer.dataProvider().capabilities() si caps & QgsVectorDataProvider.DeleteFeatures : res = layer.dataProvider().deleteFeatures(within_list)

Comme résultat de test, j'obtiens par exemple:

Mais avant d'exécuter ce script, veuillez enregistrer votre fichier qgis car si vous souhaitez traiter un fichier volumineux, ce script plante probablement votre qgis.


Vous pouvez également dupliquer la couche, puis effectuer une requête spatiale avec des "touches" entre elles. Fonctionne avec des données préparées.


Voir la vidéo: raster mask from shapefile in QGIS