8 votos

Crecimiento de los polígonos con la limitación de área y los límites de uso de ArcGIS Desktop?

Necesito crear polígonos de un área específica se basa en puntos al azar dentro de la delimitación de los polígonos, pero no he sido capaz de encontrar una herramienta capaz de hacer todas estas cosas.

He mirado en el cultivo de Theissen polígonos, pero no puede encontrar una manera de detener el crecimiento de un área específica.

He mirado en el búfer de los puntos, pero que no proporcionan una manera de hacer crecer el polígono para el área correcta dentro de la delimitación de los polígonos.

He adjuntado a mano del concepto de lo que necesito.

Point Buffer Mock-up

4voto

Anton8000 Puntos 165

Puedo usar Python y el Búfer. Cada Punto se pone en búfer, recortadas y zona está activada. Si la diferencia entre el área recortada y tamaño deseado es más que ok_diff, que se te cargan de nuevo con un poco más grandes búfer de distancia y comprobar de nuevo.. Al aceptar se obtiene anexa a la salida de fc. El código puede ser ejecutado en la Ventana de Python.

import arcpy, math
arcpy.env.overwriteOutput = True

#Change to match your data:
arcpy.env.workspace = r'C:\Default.gdb'
boundries = r'Boundries'
points = r'bufferpoints'
out_feature_class = r'GrowPoints'

#Change to match your desired size of polygon, ok difference and step in buffer radius increase
size = 7500
ok_diff = 50
increment = 1


arcpy.CreateFeatureclass_management(out_path=arcpy.env.workspace, out_name=out_feature_class, 
                                   geometry_type='POLYGON', 
                                   spatial_reference=arcpy.Describe(points).spatialReference)

arcpy.MakeFeatureLayer_management(in_features=boundries, out_layer='blyr')

with arcpy.da.SearchCursor(points,['OID@','SHAPE@']) as cursor:
    for row in cursor:
        bufferstart = math.sqrt((size/math.pi))
        sql = """{0} = {1}""".format(
            arcpy.AddFieldDelimiters(points,arcpy.Describe(points).OIDFieldName),row[0])
        arcpy.MakeFeatureLayer_management(in_features=points, out_layer='pointlyr',where_clause=sql)
        arcpy.SelectLayerByLocation_management(in_layer='blyr', overlap_type='INTERSECT', 
                                              select_features='pointlyr')
        if [i[0] for i in arcpy.da.SearchCursor('blyr','SHAPE@AREA')][0] > size:
            area = 1
            while abs(size-area)>ok_diff:
                print area
                arcpy.Buffer_analysis(in_features='pointlyr', out_feature_class=r'in_memory\point', 
                                     buffer_distance_or_field="{0} Meters".format(bufferstart))
                arcpy.Clip_analysis(in_features=r'in_memory\point', clip_features='blyr',out_feature_class=r'in_memory\clipbuffer')
                area = [i[0] for i in arcpy.da.SearchCursor(r'in_memory\clipbuffer','SHAPE@AREA')][0]
                bufferstart+=increment

            arcpy.Append_management(inputs=r'in_memory\clipbuffer', target=out_feature_class, schema_type='NO_TEST')
        else:
            print 'Impossible to fit buffer inside boundry for point number: ',row[0]

enter image description here

1voto

PRINCESS FLUFF Puntos 2072

En lugar de utilizar un buffer creo que necesita esta herramienta:

http://desktop.arcgis.com/en/arcmap/10.3/tools/production-mapping-toolbox/increase-polygon-area.htm

Además de esto, nos especifica que...

Opcionalmente, puede limitar las características, la ampliación de la base de si se cruzan otra clase de entidad

Supongo que si el búfer de una muy pequeña cantidad para dar una ronda de entidad poligonal, a continuación, utilizar esta herramienta se debe hacer el truco.

Por desgracia, parece que sólo estará disponible con la Producción de Mapeo' de la extensión o de la licencia.

1voto

FelixIP Puntos 4035

Secuencia de comandos a continuación es el uso de interseccion método para encontrar la solución:

import arcpy, math
from arcpy import env
env.overwriteOutput = True
pi=math.pi
points,polygons,buffers="POINTS","PGONS","BUFFERS"
tolerance=0.01
d=arcpy.Describe(polygons)
fld=d.OIDFieldName
outFC="in_memory/outFC"
# GET POLYGONS SHAPES
shapesDict={}
with arcpy.da.SearchCursor(polygons,(fld,"Shape@")) as cursor:
    for fid,shp in cursor:
        shapesDict[fid]=shp
curT = arcpy.da.InsertCursor(buffers,"Shape@")
# ITERATE THROUGH POINTS
with arcpy.da.SearchCursor(points,("Shape@","NEAR_FID","AREA",)) as cursor:
    for shp, pgonID, target in cursor:
        parent=shapesDict[pgonID]
        parentArea=parent.area
        if target>parentArea:
            insidePart=parent
        else:
            L = pow(parentArea/pi,0.5)/5
            H = parent.length
            while True:
                if (H-L)<tolerance:break
                M = (L+H)/2
                theBuffer=shp.buffer(M)
                cutter=theBuffer.boundary()
                insidePart=parent.cut(cutter)[1]
                if insidePart.area<target:
                    L=M
                else: H=M
        curT.insertRow((insidePart,))

Sólo el nombre de las capas en la tabla de contenidos mxd en consecuencia. Usted necesitará también para ejecutar cerca de una herramienta de puntos, por lo que su tabla de puntos se parece a:

enter image description here

Salida: enter image description here

Por desgracia arcpy geometría método se cruzan no hace lo que debe para que yo era forsed emplear el método para encontrar intersectan entre búfer y los padres polígono.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X