使用ArcGIS for Desktop在点要素周围创建方形缓冲区?


31

我想从一个点要素创建一个正方形缓冲区,但是我不理解其中的代码。

在forums.esri网站上也曾提出过类似的问题,但那是十年前的事了,当我尝试使用该代码时,它不起作用。

如何从点要素创建正方形缓冲区?


gis.stackexchange.com/questions/12479/…本质上是重复的(因为它解决了这个问题的一般性问题),但是由于这里已经有特定于正方形缓冲区的好答案,因此最好同时打开两个线程并分开而不是合并它们。但是,如果您需要更多解决方案,请阅读其他主题!
ub

2
好的,谢谢。我昨天刚找到这个网站,但我仍然很熟悉。我会在以后的帖子/问题中尝试这样做。我喜欢这个站点比ArcGIS论坛好得多。
金博尔

我并不是说该评论以任何方式成为批评,Kimball:那是为了防止两个线程合并,仅此而已。欢迎来到我们的社区!(并且请告诉您的朋友我们的信息,尤其是ArcGIS论坛上的朋友。:-)
whuber

对。我知道你不是那个意思。我非常喜欢这个社区,并且已经开始向其他人介绍这个新论坛。
金博尔

谢谢您的宝贵贡献。我想知道如何使用您提供的脚本在点要素中使用一组字段数据来创建矩形缓冲区,而无需手动输入坐标。谢谢

Answers:


47

在ArcMap 10中尝试以下步骤:

  1. 缓冲点要素(ArcToolbox>分析工具>邻近度>缓冲)。确保在“线性单位”框中选择正确的距离。
  2. 将新创建的缓冲区输入到要素包络到多边形工具(数据管理工具>功能>要素包络到多边形)。如果有多个点,请确保选择“创建零件特征”框。

对于Python解决方案:

使用SearchCursor和InsertCursor创建正方形缓冲区

在此处输入图片说明


2
+1份证明解决方案有效的回复是最好的。
ub

12

一种可能的解决方案是使用标准ESRI缓冲区工具以所需的半径创建“常规”圆形缓冲区,然后在所得的缓冲区要素类上执行“要素包络到多边形”。这将在每个特征的范围周围创建一个方形的信封特征。要素面到多边形位于数据管理>要素中。模型构建器模型看起来类似于:

在此处输入图片说明


优秀的解决方案!另外,通过将缓冲区的输出创建为in_memory层(in_memory \ tmpBuffer),可以避免将不需要的数据写入磁盘,并使处理过程更快。
RyanDalton 2012年

9

由于链接到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)


1

作为没有亚伦答案的替代方法,对于那些没有高级许可证的人,请使用“ 最小边界几何”工具。以下步骤(从Aaron修改):

  1. 缓冲点要素(ArcToolbox>分析工具>邻近度>缓冲)。确保在“线性单位”框中选择正确的距离。
  2. 将新创建的缓冲区输入“ 最小边界几何”工具(“数据管理工具”>“功能”>“最小边界几何”)。使用“ RECTANGLE_BY_AREA”或“ RECTANGLE_BY_WIDTH”,其他选项仅适用于高级许可证。

编辑:此选项不允许您在不使用“ ENVELOPE”选项(需要高级许可证)的情况下控制所得方形缓冲区的方向。勾选“将几何特征添加为输出属性(可选)”选项-产生的偏移量将在输出要素类中记录为“ MBG_Orientation”。然后,如果需要,可将其用于将要素旋转回中心-请参阅使用ArcPy从属性表按值旋转多边形吗?寻找潜在的解决方案。

在此处输入图片说明


对于我特定的要素类,最终使用此工作流将正方形旋转到不同的方向。也许是因为我有重叠的缓冲圈。不确定。我让Esri在同一个要素类上使用了上面的Aaron方法,并且它没有旋转缓冲的圆。
安德鲁

@Andrew,是的,这是没有高级许可证的工具的限制。使用ENVELOPE选项将返回与上述Aaron的方法相同的结果,但还需要高级许可证。可能的解决方法是,勾选“将几何特征添加为属性”选项,找出它们倾斜的数量(应保持一致),然后在编辑会话中将生成的正方形缓冲区旋转该数量。还没有尝试过。
邓凯

0

站点描述了如何使用geoliblib JavaScript和js2shapefile将csv转换为正方形,矩形或圆形缓冲区。

您可以看一下是否可以解决您的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.