我想从一个点要素创建一个正方形缓冲区,但是我不理解其中的代码。
在forums.esri网站上也曾提出过类似的问题,但那是十年前的事了,当我尝试使用该代码时,它不起作用。
如何从点要素创建正方形缓冲区?
我想从一个点要素创建一个正方形缓冲区,但是我不理解其中的代码。
在forums.esri网站上也曾提出过类似的问题,但那是十年前的事了,当我尝试使用该代码时,它不起作用。
如何从点要素创建正方形缓冲区?
Answers:
一种可能的解决方案是使用标准ESRI缓冲区工具以所需的半径创建“常规”圆形缓冲区,然后在所得的缓冲区要素类上执行“要素包络到多边形”。这将在每个特征的范围周围创建一个方形的信封特征。要素面到多边形位于数据管理>要素中。模型构建器模型看起来类似于:
由于链接到Aaron代码末尾的脚本只能用于方形缓冲区,而不能使用较新的arcpy.da模块,因此,我编写了一个可用于创建矩形缓冲区的脚本。在10k随机点数据集上,它在10秒内完成:
import os, arcpy
point_FC = arcpy.GetParameterAsText(0)
w = float(arcpy.GetParameterAsText(1))
h = float(arcpy.GetParameterAsText(2))
output_FC = arcpy.GetParameterAsText(3)
def rect(coord, w, h):
#Given XY coordinates and rectangle dimensions,
#return a polygon object of a rectangle centered about the point
x,y = coord
w *= 0.5
h *= 0.5
xmin,xmax = x-w, x+w
ymin,ymax = y-h, y+h
poly = ((xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin))
return arcpy.Polygon(arcpy.Array(arcpy.Point(*p) for p in poly))
#Create output feature class.
spatref = arcpy.Describe(point_FC).spatialReference
folder, base = os.path.split(output_FC)
arcpy.CreateFeatureclass_management(folder, base, "POLYGON", spatial_reference=spatref)
#Get field object for every field in input except OID and Shape.
fields = [f for f in arcpy.ListFields(point_FC) if f.type not in ("OID", "Geometry")]
for field in fields:
arcpy.AddField_management(output_FC, field.name, field.type, field.precision,
field.scale, field.length, field.aliasName,
field.isNullable, field.required, field.domain)
#Get field names to be inputted to cursors.
#Need SHAPE@XY token to read point coords and SHAPE@ token to write polygon coords.
fnames = [f.name for f in fields]
fields_in = fnames[::]
fields_out = fnames[::]
fields_in.append("SHAPE@XY")
fields_out.append("SHAPE@")
#Create buffers and write attributes to output FC, if any.
count = int(arcpy.GetCount_management(point_FC)[0])
arcpy.SetProgressor("step", "Buffering...", 0, count, 1)
with arcpy.da.SearchCursor(point_FC, fields_in) as Scursor, arcpy.da.InsertCursor(output_FC, fields_out) as Icursor:
for i,row_in in enumerate(Scursor):
#"Convert" point to rectangle
arcpy.SetProgressorPosition(i)
feature = list(row_in)
feature[-1] = rect(feature[-1], w, h)
Icursor.insertRow(feature)
假设您使用的是ArcObjects(请使用标签指定所使用的语言和API),则可以用来IEnvelope.Expand
从点的包络中创建方形缓冲区,如本例所示:从GeoFeatureLayer Snippet中的点搜索获取所有要素
ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope;
envelope.Expand(searchTolerance, searchTolerance, false);
作为没有亚伦答案的替代方法,对于那些没有高级许可证的人,请使用“ 最小边界几何”工具。以下步骤(从Aaron修改):
编辑:此选项不允许您在不使用“ ENVELOPE”选项(需要高级许可证)的情况下控制所得方形缓冲区的方向。勾选“将几何特征添加为输出属性(可选)”选项-产生的偏移量将在输出要素类中记录为“ MBG_Orientation”。然后,如果需要,可将其用于将要素旋转回中心-请参阅使用ArcPy从属性表按值旋转多边形吗?寻找潜在的解决方案。