Suite

Trouver le coin inférieur gauche d'un polygone pivoté

Trouver le coin inférieur gauche d'un polygone pivoté


Je suis actuellement aux prises avec un problème mathématique et je n'arrive pas à le résoudre.

J'ai un tas de polygones rectangulaires pivotés (la solution devrait également fonctionner pour les polygones non rectangulaires) dans différents fichiers de formes. Je veux (automatiquement) trouver le coin inférieur gauche de chacun des polygones en utilisant python (arcpy).

J'ai d'abord essayé d'utiliser simplement l'étendue, mais comme elles sont tournées, l'étendue apportera de faux résultats. Alors comment j'aborde ça ? J'ai googlé pendant des heures et la seule chose que j'ai pu trouver, c'est de calculer en quelque sorte le centre du polygone ou de le faire pivoter temporairement à 180 degrés, puis d'utiliser xmin et ymin. Voici quelques photos qui peuvent aider à détourner l'attention de mon mauvais anglais (désolé pour cela d'ailleurs)

Je n'ai eu aucun problème à exporter les coordonnées des polygones en utilisant l'outil sommets d'entités en points. Jusqu'à présent, je les ai extraits une fois dans une liste de tupels et une fois dans deux listes différentes (une pour les coordonnées x et une pour les coordonnées y)

voici donc quelques coordonnées pour faciliter le test :

format tupel :

tupelList=[[1792398.680577231, 4782539.85121522], [1792173.0363913027, 4780368.293228334], [1788935.7990357098, 4780713.732859781], [1789162.9530321995, 4782885.332685629], [1792398.68057121522] 478253]

Format liste x/liste y :

xList= [1792398.680577231, 1792173.0363913027, 1788935.7990357098, 1789162.9530321995, 1792398.680577231] yList=[4782539.85121522, 4780368.293228334, 4780713.732859781, 4782885.332685629,] 4782539.85121522

J'utilise actuellement les extensions d'alliage de largeur ArcGIS 10.3.1 et une licence avancée. La version de Python est 2.7.quelque chose


Voici une approche très simple qui décharge tout le traitement dans l'outil Sort GP. Puisque vous avez accès à une licence avancée, le tri par forme et en commençant par le coin inférieur gauche donne des résultats rapides.

import os, arcpy arcpy.env.overwriteOutput = True inFC = r'' outFC = r'' # crée la sortie FC pour contenir les points et le champ pour lier l'OID spatref = arcpy.Describe(inFC).spatialReference arcpy.CreateFeatureclass_management(*os.path.split(outFC), geometry_type="POINT", spatial_reference=spatref) arcpy.AddField_management (outFC, "ID", "LONG") avec arcpy.da.SearchCursor(inFC, ["[email protected]", "[email protected]"]) comme sCursor : avec arcpy.da.InsertCursor(outFC, ["ID", " [email protected]"]) as iCursor : pour oid, poly in sCursor : # l'utilisation d'objets Geometry est très rapide et a également l'avantage # de renvoyer des listes de géométries # Puisque nous trions les sommets par LL, le premier est la réponse verts = arcpy.FeatureVerticesToPoints_management(poly, arcpy.Geometry()) sort = arcpy.Sort_management(verts, arcpy.Geometry(), [["SHAPE", "ASCENDING"]], "LL")[0] iCursor.insertRow ([oid, trier])

D'après l'explication sur le tri spatial, nous voyons que N/S prime sur E/W :

Notez que U a la priorité sur R. R n'est pris en considération que lorsque certaines caractéristiques sont au même niveau horizontal.


Compte tenu des exemples de rectangles et de parallélogrammes, et si je comprends correctement votre formulation de "en bas à gauche" (c'est-à-dire "le plus au sud-ouest"), une solution naïve :

Vous pouvez trier les quatre sommets par ordre de latitude ascendante (c'est-à-dire que le plus au sud est le premier, le plus au nord est le dernier). Si deux sont égaux en latitude, leur séquence n'a pas d'importance. Ensuite, parmi les deux points les plus au sud, sélectionnez celui qui est le plus à l'ouest. Cela vous donnerait les coins en pointillés verts dans cette illustration :

Ce qui suit peut être des cas rares ou inexistants, mais ce qui précède s'effondre avec un quadrilatère où les deux sommets entre le plus au sud et le plus au nord sont de latitude égale, comme une forme de "diamant", ou une déformation de celui-ci , ou même lorsqu'un rectangle parfait est pivoté de la manière suivante :

Pour traiter de manière robuste ces cas, vous pouvez utiliser une approche qui calcule l'axe médian de la forme (https://en.wikipedia.org/wiki/Medial_axis), compare sa pente à 45 et 135 degrés et détermine le "fond " et " haut " de la forme par rapport à cela. Procédez ensuite comme ci-dessus, le point le plus à l'ouest des deux points "bas" étant le point à choisir. Cela fonctionnerait dans deux des cas illustrés ci-dessus. Cela échouerait toujours dans le cas d'un carré parfait en rotation "diamant" - mais alors il n'y a pas de coin inférieur gauche "naturel" à cette forme. Une autre façon de traiter ces cas où les points 2 et 3 de la séquence verticale sont à la même latitude est de prendre en fait le point 1, le point le plus au sud ; ou le point le plus à l'ouest parmi 2 et 3.


Voir la vidéo: Monikulmioiden peruskäsitteet