M0101-ArcGIS ModuleBuilder迭代器深入解析

一直对ModuleBuilder的迭代器理解不够透彻,趁着年底这几天没什么事,重新温习了下ArcGIS Desktop的帮助文档。细细品读之后,发现迭代器的功能还是非常强大的,需要配合ModuleBuilder的整个框架来使用,特别是for、while循环需要配合自定义变量来使用。这块对于编程出身的很多开发者来说,比较难以理解,至于为什么后面我们再细聊。
首先,ModuleBuilder中包含了迭代功能,目的是为了帮助开发者实现自动化多次重复执行某个过程。很多语言都提供了迭代的功能,譬如for、while循环。我们以一个场景为例:现在有一个盗窃案件的点图层,想要同时调取出每个案件一公里范围内的视频探头。如果用程序代码的话,以下代码就可以实现(以Java代码的编写风格为例):
代码一

for(int i;i<fs.length;i++){
   //首先对每个点要素执行缓存分析,距离为两公里,bufferAreaFeatures为缓冲的范围
   bufferAreaFeatures = buffer(inputFeatures,outFeatures,"2 Kilometers");
   //然后再以bufferAreaFeatures作为空间查询条件,和视频探头图层进行相交查询
   videoFeastureSet = queryTask(viedioLayer,bufferAreaFeatures); //videoFeastureSet是找出的一组视频探头
}

如果要在ModuleBuilder中实现上述功能,我们可能立马想到的是for循环。那如果要用for循环,应该怎么实现呢?我们先在ModuleBuilder中构建一个for循环,如下图:
这里写图片描述
我们看到输入有:来自值、终止值和增量,输出是值。这个中文翻译有点拗口,其实就是对应上述代码的for循环中的三个值:

  for (语句 1; 语句 2; 语句 3)
  {
     被执行的代码块
  }
  • 来自值对应语句1,这是循环的初始值,在代码块开始前执行。
  • 终止值对应语句3,在代码块已被执行之后执行。
  • 增量对应语句2,定义代码块的条件,如果该条件不满足,那么就退出代码块。
    理解了上述的参数之后,我们发现还有一个输出是:。这个值一般是作为后续其他的工具的输入。
    接下来我们就采用分解的原则,根据代码一的结构来使用ModuleBuilder的For循环。
    这里写图片描述
    1. 解决for循环中上面三个语句,如下图:
      这里写图片描述
      在上图中,增量为1,来自值(循环初始值1),需要循环的次数,利用【获取计数】工具从盗窃案件图层中获取该图层所包含的案件个数。
    2. 接下来就到循环里的代码具体执行层面了。我们需要获取每一个案件,并给每一个案件创建1公里范围的缓冲区。如下图所示:
      这里写图片描述
      这里写图片描述
      筛选的条件是根据要素的objectid来进行筛选(注意这个是比较特殊,因为这份数据的objectid是从1开始,正好和for循环输出的一样),这里的是一个变量,在模型构建器中,可通过以百分号 (%) 将替换变量括起来的方式,用一个变量的内容替换另一变量,简单说就是引用了另一个变量的值。
      这里写图片描述
      缓冲区这里需要注意的是,输出要素类也同样采用了变量的形式,意思就是输出的要素类名称根据变量的数值来定义,这样就确保每个输出的要素类名称都不一样,而且和每个案件的需要相关,提高可读性。
    3. 最终,就是找出每个缓冲区范围内的视频探头,如下图所示:
      这里写图片描述
      在这里我们用到的是裁剪这个工具。整个过程下来,会发现和编写代码的逻辑差不多,只是相对复杂,譬如要获取一个要素类中的要素时,要使用筛选工具。但是,ModuleBuilder直接提供了针对要素类循环获取每个要素的迭代器,如下图:
      这里写图片描述
      这里写图片描述
      到这里才真正的恍然大悟,原来ModuleBuilder中的迭代器是针对Esri的地理信息模型(Geodatabase),看上图就可以知道,除了针对要素类的迭代之外,还提供了包括:要素集的迭代、字段的迭代、行的迭代、文件的迭代等等,使用这些迭代器就可以省去我们很多的工作,要理解这一点才能真正理解ModuleBuilder的强大之处。关于每个迭代器该如何选择,后续会再做详细的介绍。最后,你可能已经注意到,在我们构建的模型中,包含了内存工作工具和行内变量这两个知识点,如果对这块不太理解,可以看ArcMap的帮助文档,也可以给我留言,后续也会对这两个知识点进行探讨。

猜你喜欢

转载自blog.csdn.net/peckerzeng/article/details/79320485