Comment puis-je écrire SQL (pour PostGIS dans PostgreSQL) pour supprimer les polygones de ruban (y compris les longs slivers étroits et certains petits polygones irréguliers qui étaient des `` lacunes '' erronées dans le jeu de données d'origine) de mon jeu de données en fusionnant avec un polygone adjacent avec le bord le plus long?
J'ai un jeu de données (nom de table: "Végétation" contenant plusieurs milliers de polygones identifiés comme un ruban ou un "vrai" polygone dans une colonne de description (nom de colonne: "desc") comme "ruban" ou "principal". [Modifier: Avant pour importer mon jeu de données dans PostGIS, je l'ai nettoyé en important dans GRASS (c'est aussi la façon dont j'ai converti tous les espaces en petits polygones, que j'ai ensuite fusionné avec le jeu de données principal. J'ai trouvé si j'augmentais la tolérance de capture et la surface minimale passée '' 1 'dans l'importation GRASS, j'ai commencé à perdre les fonctionnalités souhaitées.]
Je crois comprendre que je pourrais avoir besoin des étapes suivantes:
- Identifiez le polygone (Vegetation.desc = "principal") adjacent à chaque ruban (Vegetation.desc = "ruban") partageant le bord le plus long.
- Identifiez le bord entre chaque ruban et son polygone principal adjacent partageant le bord le plus long identifié à l'étape 1. (Peut-être en utilisant ST_Relate)
- Supprimez le bord entre chaque ruban et son polygone principal adjacent partageant le bord le plus long à l'aide de l'identificateur de bord retourné à l'étape 2. (Peut-être en utilisant ST_RemEdgeModFace)
Je n'ai qu'une compréhension très basique de SQL et le processus ci-dessus dépasse mes capacités.
la source
Réponses:
J'utilise ceci lors de l'agrégation des formes de l'ensemble de données GADM2 dans SQL Server:
Le
reduce()
efface les artefacts étendus et accélère les choses par un facteur de 100x - un peu rude, mais bon pour les approximations.la source