Suite

Comment puis-je créer des tampons internes proportionnés qui réduisent la taille en fonction d'un pourcentage, à un point spécifique


Je travaille dans ArcGIS et j'ai 75 polygones de bassin et une entité ponctuelle (appelée point d'origine) dans chaque polygone. (Pas nécessairement au centre des polygones). Je souhaite créer 100 polygones à l'intérieur des polygones du bassin dont la distance depuis l'origine va de 1%, 2%, etc. jusqu'à 100% du polygone du bassin. Ainsi, le polygone à 1 % aurait une limite à 1 % du chemin à partir du point d'origine. 100% polygone serait le polygone du bassin d'origine.

J'ai l'impression qu'il devrait y avoir une fonction pour cela.

Les tampons internes ne fonctionnent pas car ils sont basés sur une distance plutôt qu'un pourcentage et ne tiennent pas compte du fait que je voudrais "réduire" les polygones jusqu'au point d'origine.

J'ai vu des gens suggérer QGIS, mais cela fonctionnerait-il si je veux que les polygones "rétrécissent proportionnellement" jusqu'à un point spécifique?

J'ai essayé:

  1. convertir les polygones du bassin en sommets.
  2. effectuer une analyse de près pour calculer la distance des sommets au point d'origine et ajouter les coordonnées X/Y
  3. Création de lignes xy de l'origine à chaque sommet créant des motifs en forme d'étoile.
  4. J'ai ensuite divisé les lignes à 100% et j'allais convertir en sommets et joindre les sommets pour créer de nouvelles lignes.

Le problème est que, parce que les polygones du bassin ne sont pas réguliers, les lignes sortent parfois du polygone et rentrent, ce qui rend cette méthode inopérante.

J'espère le faire sans coder.


Comme on peut le voir sur la photo

la tâche a une solution pour des formes égales à leur propre enveloppe convexe. Si ce n'est pas le cas, la position du point et la « non-convexité » du polygone peuvent créer des artefacts. La sortie peut être légèrement améliorée en utilisant un arbre couvrant minimum des points, mais c'est de la triche et trop pour aujourd'hui.

import arcpy, traceback, os, sys from arcpy import env env.overwriteOutput = True try: def showPyMessage(): arcpy.AddMessage(str(time.ctime()) + " - " + message) mxd = arcpy.mapping.MapDocument ("CURRENT") couches = arcpy.mapping.ListLayers(mxd) points, catchments="centres","subcatchments" pointsLr = arcpy.mapping.ListLayers(mxd,points)[0] catchmLR = arcpy.mapping.ListLayers(mxd ,catchments)[0] dDest=arcpy.Describe(pointsLr) SR=dDest.spatialReference g = arcpy.Geometry() pointsList=arcpy.CopyFeatures_management(pointsLr,g) pgonsList=arcpy.CopyFeatures_management(catchmLR,g) percents=range( 10,100,10) gList=[] nPoints=len(pointsList) pour i in range(nPoints): bigList=[] pCentre=pointsList[i].firstPoint pGon = pgonsList[i] outLine=pGon.boundary() outPoints=outLine .getPart(0) pour p dans outPoints : smalList=[] array = arcpy.Array([pCentre,p]) ray=arcpy.Polyline(array,SR) crosses=ray.intersect(outLine,1) lMax=ray. longueur pour pnt en croix : lCur=ray.measureOnLine(pnt) si lCur<=lMax : pNearest=pnt;lM ax=lCur array = arcpy.Array([pCentre,pNearest]) short=arcpy.Polyline(array) pour perc en pourcentages : theP=short.positionAlongLine (float(perc)/100,True) theP=theP.firstPoint smalList. append(theP) bigList.append(smalList) m=0 pour perc en pourcentages : array = arcpy.Array() pour smalList dans bigList : p=smalList[m] array.add(p) web=arcpy.Polyline(array) arcpy.AddMessage(web.length) gList.append(web) m+=1 outp=r"d:out.shp" arcpy.CopyFeatures_management(gList,outp) sauf : message = "
*** ERREURS PYTHON ** * "; showPyMessage() message = "Informations de suivi Python : " + traceback.format_tb(sys.exc_info()[2])[0] ; showPyMessage() message = "Informations d'erreur Python : " + str(sys.exc_type)+ " : " + str(sys.exc_value) + "
" ; showPyMessage()

Je recommanderais de créer un script car vous gagnerez beaucoup de temps… mais vous pouvez le faire en ajoutant des champs au champ attributaire et en exécutant une analyse pour produire la valeur de distance proportionnelle du point au bord du bassin.

Cherchez-vous à tamponner la distance du point au bord du bassin ou du bord du bassin au point ?

Avec ces données, vous pouvez ensuite calculer la distance tampon dérivée du bord du bassin au point ou du point au bord du bassin.

Je suppose que vous avez une licence ArcGIS Advanced car vous avez déjà mentionné l'outil Near

Voici un exemple allant de la pointe au bord du bassin. Terminer par clipser le tampon au bord du bassin…

  1. Calculez la distance par point central jusqu'au bord du bassin le plus proche à l'aide de l'outil Près.
  2. Prenez la valeur de la distance linéaire (assurez-vous d'exécuter le calcul avec un CRS projeté) ajoutez-la à la table attributaire de la base de données des points.
  3. Calculez ensuite la distance proportionnelle, à l'aide du calculateur de terrain, du point au bord du bassin 100 fois par incréments de 1 par point. Chaque point se retrouvera avec 100 champs (c'est-à-dire pour chaque pourcentage).
  4. Analyse avec anneau multi-tampon, vous ajouterez manuellement les 100 valeurs de distance dans l'outil tampon pour chaque point.
  5. Découpez ensuite le tampon sur le polygone du bassin (un par un en sélectionnant le bassin avant le découpage).

Juste pour résumer comment le codage vous donnera le temps, et vos doigts sur la souris… l'étape trois à elle seule comporte 100 opérations d'ajout de champ et 100 autres opérations pour ajouter manuellement le calcul du pourcentage pour chaque champ.