5 votos

Corte de un buffer circular vía Arcpy

Actualmente estoy trabajando con estaciones de compresión en el eje central de las rutas. Estas estaciones de compresión de 3 millas de amortiguamiento alrededor de ellos. Quiero cortar una parte del búfer circular fuera. Estos buffers de corte representan el flujo unidireccional de la ruta. I plan para recortar las líneas dentro de cada uno de los buffers así que en última instancia pueden destacar estos recortadas líneas.

Abajo hay una foto de lo que he hecho manualmente a través del editor de polígonos. Quería ver si había una arcpy secuencia de comandos disponibles para que me ayude a automatizar este proceso.enter image description here

6voto

Tedy Puntos 46

He aquí un script que puse juntos. La secuencia de comandos utiliza el punto y la línea característica de la clase, y las salidas de una nueva clase de entidad de línea de línea de características deseadas. Los pasos básicos:

  • Iterar a través de los puntos
  • Crear un buffer alrededor de cada punto
  • Crear Este-Oeste de la línea de cada punto. Esto será utilizado para cortar el búfer en la mitad
  • Crear un punto al norte de cada punto de entrada. Esto será utilizado para seleccionar el norte de búfer de la mitad
  • Cortar el búfer en la mitad con la Característica de Polígono
  • Seleccione mitad norte con el punto más al norte
  • Agregar todo el norte de buffers a la nueva clase de entidad
  • Clip de entrada de la clase de entidad de línea por el norte de búferes

Tenga en cuenta que la secuencia de comandos supone una dirección norte significa un incremento en el valor de y de un punto de coordenadas. He comentado una línea diferente si la verdad es lo contrario. Usted debe encontrar con mis comentarios.

También tenga en cuenta que su punto de entrada función de las necesidades de la clase a ser en un sistema de coordenadas proyectadas.

Entradas:

  • pntFc: ruta Completa a la clase de entidad de punto
  • lineFc: ruta Completa a la clase de entidad de línea que desea cortar
  • bufferDist: Distancia en metros para el búfer de
  • área de trabajo: in_memory o una geodatabase de archivos para almacenar datos intermedios
  • outLineFC: ruta de acceso Completa de la línea de salida
  • outBufferFC: ruta de acceso Completa de la mitad de búfer de salida

Secuencia de comandos:

#Locals-----------
"""
Creates northerly buffers from point data set
Intersects line feature class 
"""

#Input point feature class
pntFc = r"C:\temp\temp.gdb\testpnt"

#Input line feature class
lineFc = r"C:\temp\temp.gdb\testline"

#Buffer distance in meters
## 3 miles * 1609.34 = 4828.03
bufferDist = 4828.03

#Workspace
workspace = r"in_memory"

#Full path of line output
outLineFC = r"C:\temp\temp.gdb\testline_out2"

#Full path of buffer output
outBufferFC = r"C:\temp\temp.gdb\buffer_out"

#End locals -----------

#Import modules
print "Importing modules"
from arcpy import *
import os

#Optional: overwrite output
#Will allow for overwriting feature classes in workspace
env.overwriteOutput = True

#Get spatial reference to determine feature class meter unit conversion
SR = Describe (pntFc).spatialReference
metersPerUnit = SR.metersPerUnit


#Create empty line feature class for east/west line - used for slicing
ewLineFc = os.path.join (workspace, "sliceLine")
CreateFeatureclass_management (workspace, "sliceLine", "POLYLINE", spatial_reference = SR)

#Create empty point feature class for northerly point - used for selecting northern half of buffer
nPointFc = os.path.join (workspace, "nPoint")
CreateFeatureclass_management (workspace, "nPoint", "POINT", spatial_reference = SR)


#Creater empty polygon to store northerly buffers
bufferHalfs = os.path.join (workspace, "bufferHalfs")
CreateFeatureclass_management (workspace, "bufferHalfs", "POLYGON", spatial_reference = SR)

#Empty list to store northern buffers
northBuffs = []

#Iterate points
print "Creating northernly half-buffers"
with da.SearchCursor (pntFc, ["SHAPE@X", "SHAPE@Y", "SHAPE@"]) as cursor:
    for xCoor, yCoor, shape in cursor:

        #Buffer feature class
        bufferFc = os.path.join (workspace, "buffer")
        Buffer_analysis (shape, bufferFc, "%s Meters" % str(bufferDist))

        ###Create east-west line feature class ------

        #Array object
        array = Array()

        #Create easterly and westerly points
        ePoint = Point()
        ePoint.Y = yCoor
        ePoint.X = xCoor + (bufferDist / metersPerUnit) + 1

        wPoint = Point()
        wPoint.Y = yCoor
        wPoint.X = xCoor - (bufferDist / metersPerUnit) - 1

        array.add (ePoint)
        array.add (wPoint)

        #Create easterly/westerly line
        line = Polyline (array)

        #Add line to east-west line feature class
        inCurs = da.InsertCursor (ewLineFc, ["SHAPE@"])
        inCurs.insertRow ((line,))
        del inCurs


        ##Done creating east-west line feature class -----

        ###Create northerly point ------
        ###Allows selection of northern buffer

        #Northerly point
        nPoint = Point()
        nPoint.Y = yCoor + ((bufferDist / metersPerUnit) /2) #Assumes increased coordinate == north
        #If north == minusing y Coordinate use:
        #nPoint.Y = yCoor - ((bufferDist / metersPerUnit) /2)
        nPoint.X = xCoor

        #Add point to  north point feature class
        inCurs = da.InsertCursor (nPointFc, ["SHAPE@"])
        inCurs.insertRow ((nPoint,))
        del inCurs

        ##Done creating northerly point ------------

        #Slice buffer
        slicedBufferFc = os.path.join (workspace, "sliceBuffer")
        FeatureToPolygon_management ([bufferFc, ewLineFc], slicedBufferFc)

        #Make feature layer to select northerly half of buffer
        MakeFeatureLayer_management (slicedBufferFc, "sliceLyr")

        #Select sliced layer by northerly point
        SelectLayerByLocation_management ("sliceLyr", "", nPointFc)

        #Get shape object from buffer selection
        northShape = [r[0] for r in da.SearchCursor ("sliceLyr", "SHAPE@")][0]

        #Add buffer half to list
        northBuffs += [northShape]

        #Clean up
        for fil in ["sliceLyr", slicedBufferFc, bufferFc]:
            Delete_management (fil)
        for fc in [nPointFc, ewLineFc]:
            DeleteRows_management (fc)


#Insert cursor to add buffers to feature class
print "Creating split buffer feature class"
cursor = da.InsertCursor (bufferHalfs, "SHAPE@")
for half in northBuffs:
    cursor.insertRow ((half,))
del cursor

print "Clipping"
#Clip buffer halfs with input line feature class
Clip_analysis (lineFc, bufferHalfs, outLineFC)

print "Created:", outLineFC

#Export buffer feature class
buffName = os.path.basename (outBufferFC)
buffPath = os.path.dirname (outBufferFC)
FeatureClassToFeatureClass_conversion (bufferHalfs, buffPath, buffName)
print "Created:", outBufferFC



for fc in [bufferHalfs, ewLineFc, nPointFc]:
    Delete_management (fc)

print "Done"

Ejemplo de entrada:

Input

Resultado: ResultBuffers

Déjeme saber si usted tiene cualquier pregunta!

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