Message posté par : GEOFFROY DETRY
----------------------------------------
Voici un cas typique. Je dois comparer deux tables polygonales (multi-polygon) stockées
sous PostGIS. Une table "commune" (Niveau admin 2, 2811 entrées) et une table
"province" (Niveau admin 1, 785 entrées). Un attribut de la table
"commune" renseigne en outre le code de la province d'appartenance.
Chaque province contient plusieurs communes. Lorsqu'une commune touche une province,
les limites de la communes doivent coïncider totalement aux limites de la province. Suite
à des erreurs de digitalisation, ce n'est pas le cas et on constate des chevauchements
/ trous (voir PJ image 1 - commune_vs_prov - avec la commune "target" en vert et
les limites des communes en pointillé rouge)
L'objectif est d'ajuster la limite des communes touchant une province pour que
cette limite coïncide avec celle de la province d'appartenance. L’intégralité des
traitements est à réaliser via PostGIS (avec contrôle visuel sur QGIS).
J'ai déjà essayé certaines traitements
1 - Snapping
J'ai exécuté la commande ST_SNAP via
-----------------
Code :
SELECT a.cod_mun, st_snap(a.geom, b.geom, tolerance) AS st_snap FROM municipality a,
province b WHERE mun_cod_prov = cod_prov
-----------------
La résultat n'est cependant pas acceptable (cf. PJ Image 2 - 2_st_snap)
2 - Buffer et découpage
L'autre option investiguée est la suivante:
Développement d'une fonction PL/pgSQL qui réalise les traitements suivants en boucle
- Sélection d'une commune target
- Création d'une vue de la table des communes sans la commune target:
commune_sans_target (ne nécessite pas de traitements spatiaux)
- réaliser un buffer assez large sur la commune target commune et découpage de ce polygone
à la frontière provinciale: comm_target_mask
-----------------
Code :
SELECT a.cod_mun,
st_intersection(st_buffer(a.geom, 500), b.geom) AS st_intersection
FROM commune a,
province b
WHERE a.cod_mun = 'COD_COMM_TARGET' AND a.mun_cod_prov = b.cod_prov
-----------------
- Ajuster la limite du polygone comm_target_mask pour quelle coïncide avec les limites des
communes voisines. Cela revient à faire une union entre comm_target_mask et
commune_sans_target puis à éliminer la partie du masque qui se superpose aux communes
voisines
Je suis sur le dernier point mais ai des difficultés à "remplir" correctement le
trou avec mon masque pour que les limites collent entre elles.
Je suis preneur d'un retour/idée si quelqu'un a réalisé un traitement similaire
dans PostGIS.
Ma config : PostgreSQL 10.7 Postgis 2.4
Merci
----------------------------------------
Ce message est accompagné de fichiers, pour les télécharger, suivre le lien ci-dessous.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=340383#p340383
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net