Comment diviser un polygone concave en polygones convexes dans Arcpy?

20

Je recherche un outil ou un algorithme pour détecter les polygones concaves et les diviser en polygones convexes. Comme expliqué dans l'image, le polygone bleu est divisé en polygones A et B

J'utilise Arcpy sous Arcgis 10.1

fractionner les polygones

geogeek
la source
15
Peut-être pourriez-vous expliquer pourquoi vous faites cela? Après tout, (a) la détection est facile: un polygone concave aura moins de surface que sa coque convexe; et (b) toute triangulation d'un polygone le divise automatiquement en polygones convexes, car tous les triangles sont convexes. Cela montre que vous avez une certaine flexibilité dans le choix parmi les nombreuses solutions possibles.
whuber
2
Cet ensemble d'outils vous permettra de voir de quoi parle Bill. Resources.arcgis.com/gallery/file/geoprocessing/… convertissez le polygone en points puis exécutez l'option Delaunay
1
Il y a une réponse à cela sur Stack Overflow: stackoverflow.com/a/6686842/1300519 Les algorithmes décrits ne devraient pas être trop difficiles à écrire en utilisant arcpy.
Snorfalorpagus
1
@snorf Cela semble répondre à une question légèrement, mais surtout différente. La solution implique apparemment une combinaison de "polygones" et de "trous" , ce qui n'est pas ce que l'on entend généralement par "fractionnement". À tout le moins, cette réponse doit être développée davantage pour être utile ici. (BTW, votre réponse a été remplacée par un commentaire car les renvois à d'autres solutions ailleurs sur le Web, sans aucune explication supplémentaire, ne sont pas considérés comme des réponses ici sur SE.)
whuber
2
À en juger par les commentaires ici et par l'absence de réponses, ma recommandation serait de modifier votre question pour intégrer ces commentaires et envisager d'offrir une prime.
PolyGeo

Réponses:

1

voici quelques étapes pour identifier les sommets des parties concaves:

avec parcelle: géométrie de délimitation minimale (coque) -> parcelHull

avec parcelle: FeatureVerticesToPoint -> parcelPoints

avec parcelHull: FeatureVerticesToPoint -> parcelHullPoints

avec parcelPoint et parcelHullPoint: Diff symétrique -> ConcavePoints

en fonction de ces points, vous pouvez soit dessiner la bissectrice pour couper votre polygone (distance de relèvement à la ligne), sélectionner les bords du triangle Voronoï qui coupent votre point mais ne partagent pas un segment avec la limite de votre parcelle (sélectionnez par emplacement après avoir divisé le triangle lignes aux sommets), sélectionnez le sommet sur le site opposé et faites une ligne (pointe vers la ligne), sélectionnez le point le plus proche sur le bord opposé et faites une ligne (pointe vers la ligne) ...

À la fin, utilisez vos lignes préférées et les parcelles d'origine avec "entité vers polygone" pour diviser les polygones.

radouxju
la source