如何使用ArcGIS中的字段计算器查找多边形是否有孔


10

某些第三方软件无法处理带孔的多边形(甜甜圈多边形)。要找到它们,我总是使用ArcView 3字段计算器,因为:

在此处输入图片说明

但是,当我尝试在ArcGIS中执行此操作时,得到以下信息:

在此处输入图片说明

所以问题是如何在ArcGIS中正确设置。


令我惊讶的是,零件计数未按预期工作,因此我做了一些挖掘工作。事实证明,甜甜圈有时可能是带有内环的单个零件特征-请参阅本页最后一个代码块之前的句子/图形。我还看到了一个有关脚本的线程该线程可以在python中但在现场计算器中无法检测到它们。
克里斯·W

我可以使用代码块来做到这一点,但这很丑陋。主线prt = shp.getPart(0)feat = arcpy.Polygon(prt)。计算feat.area并将其与shp.area进行比较就足够了
FelixIP 2015年

相关资源:gis.stackexchange.com/questions/27255您的区域比较解决方案可能很难看,但似乎可以在Field Calculator中使用。可能值得发布作为答案。
克里斯·W

我宁愿感谢@Hornbydd,因为他的答案比较的是整数,我自己(我很久以前就知道)处理双精度数
FelixIP 2015年

Answers:


19

零件数不会产生正确的答案。您可以有一个没有孔的多部分多边形。参见下图以了解情景。

多部分多边形

这本来是在ArcGIS 10之前的简单查询,因为您可以调用ArcObjects来询问多边形是否有孔,但是ESRI已删除了VBScripting环境中的许多支持,以至于现在它已经变得毫无用处了,真可惜...

无论如何,您可以使用一些Python解决此问题:

def hasHole(geom):
  parts = geom.partCount
  boundaries = geom.boundary().partCount
  if boundaries > parts:
    return 1
  else:
    return 0

在表达式框中,您将放置以下内容:

hasHole(!Shape!)

感谢您的优雅回答。我在没有ArcView 3的情况下使用的那种可靠性较差,请参阅我对@ChrisW的评论
FelixIP

1

您是指两个表达式之间的区别吗?如果是,则看起来最下面的一个正在使用Python作为解析器,而最上面的一个正在使用VB。要在ArcGIS的“字段计算器”窗口中更改此设置,只需选择VB而不是Python,顶部表达式应该起作用。


请问VB中的表达是什么
FelixIP
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.