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:
Resultado:
Déjeme saber si usted tiene cualquier pregunta!