Message posté par : GEOFFROY DETRY
----------------------------------------
Bonsoir Nico,
-----------------
Citation :
Elle est un peu pourrie ma méthode je pense
-----------------
J'ai trouvé l'idée séduisante et avait débuté une implémentation sur cette base.
Une première chose que j'ai faite est de ne retenir que les vertex
"candidats" de la limite "commune", c'est-à-dire les vertex qui
s'intersectent avec une commune voisine qui elle-même appartient à une province
différente (en focalisant l'analyse sur la cod_mun='189110001', on dégage 70
points candidats qui doivent s'ajuster)
Ensuite, je n'ai pas eu de difficultés à trouver les vertex correspondants les plus
proches sur la limite provinciale.
Évidemment, un des manquements de la méthode est qu'on ne tient pas compte du
comportement même de la limite provinciale entre deux points "les plus proches"
(cf. PJ). Des vertex sont donc manquants pour voir la limite de commune s'adapter à la
limite de province.
En étudiant le cas, je me suis dit qu'il y avait moyen de récupérer tous les vertex du
tronçon de limite provinciale situés entre le premier et le dernier point "les plus
proche sur la limite provinciale", ces deux points étant connus par le traitement
KNN. Cet ensemble de vertex viendrait remplacer le tronçon de limite communale situé entre
le premier et dernier point "les plus proches sur la limite communale". Ensuite
on reconstruit le polygone.
J'en étais là quand j'ai vu ton second post, que je vais lire attentivement. Je
n'ai donc pas implémenté la recherche de tous les vertex provinciaux, mais en tout cas
cela pourrait théoriquement tenir la route.
Je place ici l'implémentation SQL permettant de retrouver le vertex provincial le plus
proche pour chacun des 70 vertex communaux candidats. Le code n'est pas optimisé du
tout et des trucs ne servent à rien mais je le mets tel qu'il est en construction
(pour si ça intéresse qq)
-----------------
Code :
WITH
com_target as (
select cod_mun, mun_cod_prov, nombre_com, geom from dts_commune where
cod_mun='189110001'
),
com_target_pt as (
select cod_mun, mun_cod_prov, nombre_com, (ST_DumpPoints(geom)).geom as geom_com_pt from
com_target
),
com_neigh as (
select cod_mun, mun_cod_prov, nombre_com, geom as geom_com_neigh from dts_commune
where st_intersects(geom, (select geom from com_target)) and mun_cod_prov<> (select
mun_cod_prov from com_target)
),
-- Vertex candidats de la commune = vertex qui s'interesectent avec une commune
voisine qui appartiene à une province différente
com_target_pt_cand as (
SELECT row_number() OVER (ORDER BY com_target_pt.geom_com_pt) AS gid,
com_target_pt.geom_com_pt
FROM com_target_pt, com_neigh
WHERE st_intersects(com_target_pt.geom_com_pt, com_neigh.geom_com_neigh)
),
prov_target as (
select * from dts_province where cod_prov = '18911'
),
prov_target_pt as (
select cod_prov, nom_prov, (ST_DumpPoints(geom)).geom as geom_prov_pt from dts_province
where cod_prov = '18911'
),
prov_neigh as (
select * from dts_province where st_intersects(geom, (select geom from dts_province where
cod_prov='18911')) and cod_prov <> '18911'
)
select gid, geom_com_pt, geom_prov_pt, dist
from com_target_pt_cand
CROSS JOIN LATERAL
(SELECT
cod_prov, geom_prov_pt,
ST_Distance(geom_prov_pt, geom_com_pt) as dist
FROM prov_target_pt
ORDER BY geom_com_pt <-> geom_prov_pt
LIMIT 1
) AS closest_vert_prov
-----------------
Je garde l'idée de la sélection des vertex au frais et je vais étudier le travail
réalisé à partir des arcs des deux couches. En tout cas merci beaucoup pour ce retour très
détaillé, vraiment super. Je passe à l'action et ferai un retour
Geoffroy
----------------------------------------
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=340432#p340432
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