使用ArcPy获取shapefile中每个多边形的范围?


20

在ArcGIS 10和Python中,我想获取shapefile中每个多边形的范围(xmax,ymax,xmin,ymin)信息。

我可以使用获取整个shapefile的范围

file=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
desc=arcpy.Describe(file)
print desc.extent.Xmax

394551.52085039532

但是我似乎无法弄清楚如何为数据集中的每一行获取相同的信息。

rows = arcpy.SearchCursor("100k_trc_tiles_TVM")
for row in rows:
 print row

打印数据集中的31行,但是

for row in rows:
 desc=arcpy.Describe(row)
 print desc.extent.Xmax

给出一个错误。

运行时错误:对象:描述输入值无效的类型

我当时正在考虑使用“计算几何”将范围值添加到表中,但这仅给出了质心。然后,我猜我们可以使用诸如row.GetValue(“ xmax”)之类的东西。

话虽这么说,我知道我们可以使用http://www.ian-ko.com/free/free_arcgis.htm中的函数创建X / Y,max / min,但是最好避免添加字段,尤其是在ArcPy可以获取这些值的情况下。

基本上,我需要获取范围以输入到裁剪工具中,以裁剪出30个数据区域(根据1:100,000地图图)进行地理处理,因为拆分工具由于数据集的大尺寸而失败(请参见为什么相交会给错误999999:错误执行功能无效拓扑[太多lineseg端点])。我要自动执行此操作,因为它在许多数据集上重复出现。

===工作脚本===

# Emulates Arc Info SPLIT tool by using Clip but
# Requires a FC from which each row is used as the input clip feature.
# Each row must be rectangular.
# Used on 12GB FGDB with 100 million records.


#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com
import arcpy, string

#inFrame=arcpy.GetParameterAsText(0) # Input dataframe FC
#inFile=arcpy.GetParameterAsText(1) # Input FC for splitting
#outDir=arcpy.GetParameterAsText(2) # Output FGDB

inFrame=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
inFile=r"c:\junk\106\data\7_Merge.gdb\FullRez_m2b"
outDir=r"D:\SCRATCH\Projects\206\datasplit\test_slaasp.gdb"
#NameField="Name_1"

#arcpy.env.workspace = r"C:/Workspace"
arcpy.env.overwriteOutput = True

rows = arcpy.SearchCursor(inFrame)
shapeName = arcpy.Describe(inFrame).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    Name = row.Name_1
    print "Executing clip on: "+str(Name)
    extent = feat.extent
    #print extent.XMin,extent.YMin,extent.XMax,extent.YMax
# Create an in_memory polygon
    XMAX = extent.XMax
    XMIN = extent.XMin
    YMAX = extent.YMax
    YMIN = extent.YMin
    pnt1 = arcpy.Point(XMIN, YMIN)
    pnt2 = arcpy.Point(XMIN, YMAX)
    pnt3 = arcpy.Point(XMAX, YMAX)
    pnt4 = arcpy.Point(XMAX, YMIN)
    array = arcpy.Array()
    array.add(pnt1)
    array.add(pnt2)
    array.add(pnt3)
    array.add(pnt4)
    array.add(pnt1)
    polygon = arcpy.Polygon(array)
    ShapeFile = outDir+"\\temp_poly"
    arcpy.CopyFeatures_management(polygon, ShapeFile)

    #print Name
### Set local variables
    in_features = inFile
    clip_features = ShapeFile
    out_feature_class = outDir+"\\"+Name
    xy_tolerance = "0.22"

    # Execute Clip

    try:
        arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
        print "Completed: "+str(Name)
    except:
        error = arcpy.GetMessages()
        print "Failed on: "+str(Name)+" due to "+str(error)

2
您无需将剪辑功能写入磁盘,只需使用内存中的多边形,例如:polygon = arcpy.Polygon(array)arcpy.Clip_analysis(in_features,polygon,out_feature_class,xy_tolerance)
user2856

tks。知道如何将行导出到新的形状文件以便使用,而不只是行的范围吗?这样一来,它也可以处理非矩形的剪辑。
GeorgeC 2011年

1
好吧,如果您只想在同一脚本中裁剪该功能,则只需使用功能对象。同样,无需导出到形状文件,例如:arcpy.Clip_analysis(in_features,feat,out_feature_class,xy_tolerance)
user2856 2011年

对于shapefile还是shapefile中的每个多边形?好像您在这里谈论两件事。
雷纳2012年

您的shapefile中只有一个多边形对象吗?如果不是,请为您的对象范围使用for循环。
阿拉贡

Answers:


26

在光标中获取形状对象并访问其range属性。请参见ArcGIS Help 在Python中使用几何

shapeName = arcpy.Describe(inFeatures).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    extent = feat.extent
    print extent.XMin,extent.YMin,extent.XMax,extent.YMax

1
谢谢卢克。这很棒。如果有人想使用以下工具,我将编辑问题以使用新的工作代码:-迭代使用“剪切”工具集以剪切出大型要素类的矩形区域。模拟弧信息拆分工具的功能,而不会崩溃至最大10GB FGDB和1亿条记录的数据集。
GeorgeC 2011年

一件事-我不得不对列的名称进行硬编码,以通过将name属性尝试为;获得与Name = row.Name_1等效的名称。NameField =“ Name_1”; Name = row.NameField; 或Name = row +“。” + NameField,其中NameField = arcpy.GetParameterAsText(2),并且Name保留在Name_1列中。有任何想法吗?注意我;使用“;” 表示换行。
GeorgeC 2011年


7

边界容器工具集不正是你想要的。如果只需要代码片段,请检查脚本中的功能,其中一个明确地涉及范围。

编辑

我应该补充一点,脚本将为创建的输出文件中的Left,Right,Top和Bottom字段添加值,这些值可用于后续处理


谢谢。会检查出来的。希望我可以在python脚本/模型中使用代码。
GeorgeC 2011年

2

我刚刚尝试了ArcGIS 10中的“最小边界几何(信封)(在数据管理中)”,对于所有字段,它似乎完全一样。


1

另一种方法是在shapefile上执行SearchCursor(),然后可以使用row.shape.extent:

rows = arcpy.SearchCursor(shapefileName)

for row in rows:
   extent = row.shape.extent
   ...
   ...

1

在ArcMap提取多边形顶点的坐标中所述? 您可以获取多边形的顶点,然后将每个顶点的x和y坐标添加为属性表中的字段。这具有不能将最大/最小坐标直接附加到每个多边形的局限性,但这可以通过几种方式来实现。

我最熟悉的方法是使用pyshp模块将x和y字段读入python列表中,然后可以对其进行排序以找到每个多边形的最大值和最小值。然后可以使用Pyshp打开writer类,以将新字段添加到原始多边形,并将这些max和min值写入正确的多边形。

我相信可以使用arcpy做到这一点,但是在使用geoprocessor写入9.3中的shapefile时遇到了很多问题,因此我更喜欢pyshp方法,但是我不确定arcpy模块是否解决了这些问题。


0

您是否尝试将“ XMax”中的“ M”大写?我认为应该是:

print desc.extent.XMax

代替

print desc.extent.Xmax

根据文档。当然,这使我想知道您的第一个代码段是如何工作的。无论哪种方式,请尝试一下!

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.