Fractionner le chevauchement entre les polygones et l'affecter au polygone le plus proche à l'aide de PostGIS?

8

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:

carte

(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_VoronoiPolygonsmais 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?

kthy
la source
Dans l'image ci-dessus, est-ce que ce petit grain d'eaux internationales non bleues? ou remplissez-vous cela?
Evan Carroll
Le non bleu est simplement en dehors de tous les polygones - je ne fais qu'un tampon de 250 mètres, donc ce sont toujours des eaux nationales. Pour mon but, j'ai juste besoin d'un petit tampon pour m'assurer que j'attrape des fonctionnalités "dans le surf". Voir le trou au sud de l'île au milieu me donne définitivement envie de faire un vidage ExteriorRing, mais ce n'est pas pertinent pour cette question. :)
kthy
Avez-vous trouvé une solution? Je suis confronté à un problème similaire et je voudrais partager certains polygones qui se chevauchent avec leurs voisins.
DanielK
Malheureusement, aucune solution pour le moment. J'ai une idée de progresser en utilisant une combinaison de ExteriorRinget Intersectsmais je n'ai pas eu le temps d'y travailler pendant les vacances.
kthy
votre exemple peut avoir été partiellement automatisé, mais la fonction st_difference se comporte horriblement lors de la coupe, laissant des "moustaches" sur les bords des coupes, ce qui oblige le développeur à rechercher des solutions de contournement, et les cas de fusion de polygones peuvent être à la fois simples et compliqués, ce qui entraînera une révision manuelle ... vous avez encore du mal à travailler avec votre exemple?
Cyril Mikhalchenko

Réponses:

5

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):

entrez la description de l'image ici 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;

entrez la description de l'image ici

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.

entrez la description de l'image ici

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.

entrez la description de l'image ici

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;

entrez la description de l'image ici

6) Dans QGIS Sur la table exper_list6 lancez l'outil "triangulation Delaunay" et obtenez le résultat exper_list10 voir figure 6

entrez la description de l'image ici

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;

entrez la description de l'image ici

8) Dans exper_list6, coupez le résultat exper_list11, figure 8 exper_list12;

entrez la description de l'image ici

9) Dans exper_list4, coupez exper_list11 le résultat obtenu 9 exper_list13;

entrez la description de l'image ici

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.

entrez la description de l'image ici

bonne chance, vôtre fidèlement

Cyril Mikhalchenko
la source
Cela ressemble à de l'or massif. Je le marquerai comme accepté une fois que j'aurai eu le temps de le tester la semaine prochaine. Merci!
kthy