在forums.esri网站上也曾提出过类似的问题,但这已经超过10年了,当我尝试使用该代码时它不起作用。
如何创建点特征的正方形缓冲区?
#1 楼
在ArcMap 10中尝试以下步骤:缓冲点要素(ArcToolbox>分析工具>邻近度>
缓冲)。确保在“线性”
单位框中选择正确的距离。
将新创建的缓冲区输入到“要素包络到
多边形”工具(“数据管理工具”>“要素”>“要素包络到
多边形)。如果有多个点,请确保选择“创建多重零件特征”框。
对于Python解决方案:
使用SearchCursor和InsertCursor创建正方形缓冲区
评论
+1份证明解决方案有效的回复是最好的。
– hu
2012年7月12日13:19
#2 楼
一种可能的解决方案是使用标准ESRI缓冲区工具以所需的半径创建“常规”圆形缓冲区,然后在所得的缓冲区要素类上执行“要素包络到多边形”。这将在每个特征的范围周围创建一个方形的信封特征。要素到多边形的信封位于数据管理>要素中。模型构建器模型看起来类似于:评论
优秀的解决方案!此外,通过将缓冲区的输出创建为in_memory层(in_memory \ tmpBuffer),可以避免将不需要的数据写入磁盘,并使处理过程更快。
– RyanKDalton
2012年7月12日下午14:15
#3 楼
由于链接在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)
#4 楼
假设您使用的是ArcObjects(请使用标签指定所使用的语言和API),则可以使用IEnvelope.Expand
从点的包络创建方形缓冲区,如本例所示:从GeoFeatureLayer中的点搜索获取所有要素片段 ESRI.ArcGIS.Geometry.IEnvelope envelope = point.Envelope;
envelope.Expand(searchTolerance, searchTolerance, false);
#5 楼
对于那些没有高级许可的人,可以使用最小边界几何工具来替代亚伦的答案。下面的步骤(从Aaron修改):缓冲点要素(ArcToolbox>分析工具>邻近度>缓冲)。确保在“线性单位”框中选择正确的距离。
将新创建的缓冲区输入“最小边界几何”工具(“数据管理工具”>“功能”>“最小边界几何”)。使用'RECTANGLE_BY_AREA'或'RECTANGLE_BY_WIDTH',其他选项仅在高级许可证中可用。
编辑:此选项不允许您控制结果正方形缓冲区的方向,而无需使用'信封”选项(需要高级许可证)。勾选“将几何特征添加为输出属性(可选)”选项-产生的偏移量将在输出要素类中记录为“ MBG_Orientation”。然后,如果需要,可将其用于将要素旋转回中心-请参阅使用ArcPy从属性表按值旋转多边形吗?寻求解决方案。
评论
对于我特定的要素类,最终使用此工作流程将正方形旋转到不同的方向。也许是因为我有重叠的缓冲圈。不确定。我让Esri在同一个要素类上使用上面的Aaron方法,并且它没有旋转缓冲的圆。
–安德鲁(Andrew)
19年7月29日在14:26
@Andrew,是的,这是没有高级许可证的工具的限制。使用ENVELOPE选项将返回与上述Aaron的方法相同的结果,但还需要高级许可证。可能的解决方法是,勾选“将几何特征添加为属性”选项,找出它们倾斜的数量(应保持一致),然后在编辑会话中将生成的正方形缓冲区旋转该数量。还没有尝试过。
–唐凯恩
19年7月31日在1:05
#6 楼
该站点描述了如何使用geoliblib JavaScript和js2shapefile将csv转换为正方形,矩形或圆形缓冲区。如果它解决了问题,您可以看看。
评论
gis.stackexchange.com/questions/12479/…本质上是重复的(因为它解决了这个问题的一般性问题),但是由于这里已经有特定于正方形缓冲区的好答案,因此最好同时打开两个线程并分开而不是合并它们。但是,如果您想要更多解决方案,请阅读其他主题!好的,谢谢。我昨天刚找到这个网站,但我仍然很熟悉。我会在以后的帖子/问题中尝试这样做。我喜欢这个站点比ArcGIS论坛好得多。
我并不是说该评论以任何方式成为批评,Kimball:那是为了防止两个线程合并,仅此而已。欢迎来到我们的社区! (并请向您的朋友介绍我们,尤其是在ArcGIS论坛上的朋友。:-)
对。我知道你不是那个意思。我非常喜欢这个社区,并且已经开始向其他人介绍这个新论坛。
谢谢您的宝贵贡献。我想知道如何使用您提供的脚本在点要素中使用一组字段数据来创建矩形缓冲区,而无需手动输入坐标。谢谢