ArcGIS 脚本每次都在循环中缓冲所有要素——为什么?
ArcGIS script is buffering all features each time through the loop -- why?
我有一个包含多条记录的多边形 shapefile。我需要单独缓冲每一个并为每个创建一个新的缓冲多边形 shapefile。
我在 ArcPy 中编写了以下独立脚本。它做了一些我需要的,但不是为每条记录创建一个单独的缓冲多边形 shapefile,而是创建几个 shapefile,每个 shapefile 都有一个包含应用于所有特征的缓冲区的多部分多边形。我想知道如何改变它。
我正在使用 ArcGIS 10.3.1。
import arcpy
from arcpy import env
file_workspace = "C:\Data\Temp\"
env.workspace = file_workspace
arcpy.env.overwriteOutput = True
fc_In1 = file_workspace + "fc_InPolygon.shp"
fc_In1_FieldName = "PLOTNAME"
var_Buffer = "50 Meters"
numCount = 1
# Iterate through the rows in the cursor and buffer each
with arcpy.da.SearchCursor(fc_In1, fc_In1_FieldName) as cursor:
for row in cursor:
var_PolygonName = row[0]
print "Buffering polygon " + var_PolygonName
arcpy.MakeFeatureLayer_management(fc_In1, "Poly_lyr")
arcpy.Buffer_analysis("Poly_lyr", var_PolygonName+'_Buff.shp', var_Buffer, "FULL", "ROUND", "ALL", "")
您的脚本重复使用输入要素 class 中的所有要素创建图层,然后缓冲该图层(因此,多个输出形状文件都包含相同的内容)。
您需要使用 SQL 查询包含 select by attribute, or make your feature layer,以在缓冲之前限制要素图层中的内容。
在任何一种情况下,您的查询都按照 '"FIELDNAME" = \'POLYGONNAME\''
行,或者使用变量:
'"{}" = \'{}\''.format(fc_In1_FieldName, var_PolygonName)
'"' + fc_In1_FieldName + '" = \'' + var_PolygonName + '\''
(我喜欢 the format
method 以提高连接时的可读性,尤其是在使用那么多 single/double 引号时。)
# Using MAKE FEATURE LAYER with SQL QUERY
with arcpy.da.SearchCursor(fc_In1, fc_In1_FieldName) as cursor:
for row in cursor:
var_PolygonName = row[0]
print "Buffering polygon " + var_PolygonName
arcpy.MakeFeatureLayer_management(fc_In1, "Poly_lyr", '"{}" = \'{}\''.format(fc_In1_FieldName, var_PolygonName))
arcpy.Buffer_analysis("Poly_lyr", var_PolygonName+'_Buff.shp', var_Buffer, "FULL", "ROUND", "ALL", "")
SelectLayerByAttribute
的主要优点是您不会在内存中创建 dozens/hundreds 个特征层,但这可能不是小特征 class 的问题。
# Using SELECT BY ATTRIBUTE
arcpy.MakeFeatureLayer_management(fc_In1, "Poly_lyr") # no need to make the layer each time through the cursor
with arcpy.da.SearchCursor(fc_In1, fc_In1_FieldName) as cursor:
for row in cursor:
var_PolygonName = row[0]
print "Buffering polygon " + var_PolygonName
arcpy.SelectLayerByAttribute_management("Poly_lyr", "NEW_SELECTION", '"{}" = \'{}\''.format(fc_In1_FieldName, var_PolygonName))
arcpy.Buffer_analysis("Poly_lyr", var_PolygonName+'_Buff.shp', var_Buffer, "FULL", "ROUND", "ALL", "")
我有一个包含多条记录的多边形 shapefile。我需要单独缓冲每一个并为每个创建一个新的缓冲多边形 shapefile。
我在 ArcPy 中编写了以下独立脚本。它做了一些我需要的,但不是为每条记录创建一个单独的缓冲多边形 shapefile,而是创建几个 shapefile,每个 shapefile 都有一个包含应用于所有特征的缓冲区的多部分多边形。我想知道如何改变它。
我正在使用 ArcGIS 10.3.1。
import arcpy
from arcpy import env
file_workspace = "C:\Data\Temp\"
env.workspace = file_workspace
arcpy.env.overwriteOutput = True
fc_In1 = file_workspace + "fc_InPolygon.shp"
fc_In1_FieldName = "PLOTNAME"
var_Buffer = "50 Meters"
numCount = 1
# Iterate through the rows in the cursor and buffer each
with arcpy.da.SearchCursor(fc_In1, fc_In1_FieldName) as cursor:
for row in cursor:
var_PolygonName = row[0]
print "Buffering polygon " + var_PolygonName
arcpy.MakeFeatureLayer_management(fc_In1, "Poly_lyr")
arcpy.Buffer_analysis("Poly_lyr", var_PolygonName+'_Buff.shp', var_Buffer, "FULL", "ROUND", "ALL", "")
您的脚本重复使用输入要素 class 中的所有要素创建图层,然后缓冲该图层(因此,多个输出形状文件都包含相同的内容)。
您需要使用 SQL 查询包含 select by attribute, or make your feature layer,以在缓冲之前限制要素图层中的内容。
在任何一种情况下,您的查询都按照 '"FIELDNAME" = \'POLYGONNAME\''
行,或者使用变量:
'"{}" = \'{}\''.format(fc_In1_FieldName, var_PolygonName)
'"' + fc_In1_FieldName + '" = \'' + var_PolygonName + '\''
(我喜欢 the format
method 以提高连接时的可读性,尤其是在使用那么多 single/double 引号时。)
# Using MAKE FEATURE LAYER with SQL QUERY
with arcpy.da.SearchCursor(fc_In1, fc_In1_FieldName) as cursor:
for row in cursor:
var_PolygonName = row[0]
print "Buffering polygon " + var_PolygonName
arcpy.MakeFeatureLayer_management(fc_In1, "Poly_lyr", '"{}" = \'{}\''.format(fc_In1_FieldName, var_PolygonName))
arcpy.Buffer_analysis("Poly_lyr", var_PolygonName+'_Buff.shp', var_Buffer, "FULL", "ROUND", "ALL", "")
SelectLayerByAttribute
的主要优点是您不会在内存中创建 dozens/hundreds 个特征层,但这可能不是小特征 class 的问题。
# Using SELECT BY ATTRIBUTE
arcpy.MakeFeatureLayer_management(fc_In1, "Poly_lyr") # no need to make the layer each time through the cursor
with arcpy.da.SearchCursor(fc_In1, fc_In1_FieldName) as cursor:
for row in cursor:
var_PolygonName = row[0]
print "Buffering polygon " + var_PolygonName
arcpy.SelectLayerByAttribute_management("Poly_lyr", "NEW_SELECTION", '"{}" = \'{}\''.format(fc_In1_FieldName, var_PolygonName))
arcpy.Buffer_analysis("Poly_lyr", var_PolygonName+'_Buff.shp', var_Buffer, "FULL", "ROUND", "ALL", "")