Ma question est assez liée au chevauchement de Split sans réponse entre les polygones en ensembles disjoints, sauf que je n'utilise pas shapely
, j'utilise PostGIS 2.4 sur PostgreSQL 10.
J'ai une table contenant des multipolygones pour les unités administratives. Les géométries ne couvrent que la superficie du terrain. Mon objectif est de les prolonger d'une distance donnée dans l'eau.
Pour étendre les polygones actuels dans l'eau, je fais un tampon suivi de soustraire toutes les autres géométries du tableau. Cela coupe le tampon où la géométrie a des voisins et conserve le tampon où la couche n'a actuellement rien. Donc, quelque chose comme:
SELECT c1.name
, ST_Difference( ST_Buffer( ST_Union(c1.geom), 250 )
, (SELECT ST_Union(c2.geom)
FROM foo.county AS c2
WHERE c2.name <> c1.name)
)
FROM foo.county AS c1
GROUP BY c1.name;
Cependant, cela me donne bien sûr des tampons qui se chevauchent où deux polygones se rencontrent au bord de l'eau, ainsi qu'à travers des détroits étroits:
(Notez que le petit ruban violet sur la gauche doit être complètement affecté au polygone rouge, car aucun point dans cette géométrie n'est plus proche du bleu que du rouge en raison de la péninsule en forme d'appendice.)
C'est là que je suis coincé. Je veux couper les chevauchements (parties violettes) en deux polygones disjoints le long d'une ligne équidistante des polygones non tamponnés, puis soustraire ces éclats des comtés tamponnés.
Je ne pense pas avoir un cas de trois tampons ou plus qui se chevauchent. Je traverserai ce pont si et quand j'y arriverai.
Cela me sent comme quelque chose de similaire, mais pas tout à fait identique à l'utilisation, ST_VoronoiPolygons
mais autour de polygones au lieu de points.
Est-ce que cela existe - idéalement - en tant que fonctions PostGIS, en tant que fonctionnalité de géotraitement QGIS ou peut-être dans certaines bibliothèques python?
ExteriorRing
etIntersects
mais je n'ai pas eu le temps d'y travailler pendant les vacances.Réponses:
Si la solution à ce problème est pertinente et que je l'ai bien comprise, sa solution est la suivante: (Les données d'origine sont abstraites, si j'ai bien compris, elles sont adjacentes se croisant sur le tampon avec un nombre de mètres donné, dans mon cas 2 tableaux : exper_list3 et exper_list4 voir figure 1):
1) Dans pgAdmin, exécutez la requête:
create table exper_list5 as SELECT st_intersection (exper_list4.geom, exper_list3.geom) AS geom FROM exper_list4, exper_list3 WHERE st_intersects (exper_list4.geom, exper_list3.geom) = true;
result: table exper_list5 voir figure 2;2) Dans pgAdmin, exécutez la requête:
create table exper_list6 as SELECT (ST_Dumppoints (geom)). Geom FROM exper_list5;
Le résultat est une table avec des points, accédez en plus aux propriétés de la table, créez un champ gid et définissez des restrictions dessus;3) Dans QGIS, exécutez l'outil Polygone Voronoi sur la table (couche vectorielle) exper_list6 Le résultat est illustré à la figure 3.
4) Dans pgAdmin, exécutez la requête:
create table exper_list8 as SELECT (ST_Dumppoints (geom)).geom FROM exper_list7;
le résultat est illustré à la figure 4.5) Sélectionnez parmi exper_list8 les points qui entrent dans le polygone exper_list5 Dans pgAdmin, exécutez la requête:
create table exper_list9 as SELECT st_intersection (exper_list8.geom, exper_list5.geom) AS geom FROM exper_list8, exper_list5 WHERE st_intersects (exper_list8.geom, exper_list5.geom) = true;
et copiez ces points dans le résultat de la table exper_list6 figure 5;6) Dans QGIS Sur la table exper_list6 lancez l'outil "triangulation Delaunay" et obtenez le résultat exper_list10 voir figure 6
7) Dans QGIS en mode d'édition "Crayon" dans le tableau exper_list10 choisissez les triangles qui frappent la zone d'intérêt, utilisez l'outil "Vector" - "Géotraitement" - "Unification par entité" (cochez "uniquement les objets sélectionnés" "Classification" - par tous les signes) résultat exper_list11 figure 7;
8) Dans exper_list6, coupez le résultat exper_list11, figure 8 exper_list12;
9) Dans exper_list4, coupez exper_list11 le résultat obtenu 9 exper_list13;
10) Des actions similaires doivent être effectuées avec le polygone gauche (dans mon cas, la table exper_list4)
11) Le résultat global est les deux tables exper_list13 et exper_list14 voir figure 10.
bonne chance, vôtre fidèlement
la source