您的位置:首页 > 产品设计 > UI/UE

M0101-ArcGIS ModuleBuilder迭代器深入解析

2018-02-13 12:23 363 查看
一直对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循环。



解决for循环中上面三个语句,如下图:



在上图中,增量为1,来自值(循环初始值1),需要循环的次数,利用【获取计数】工具从盗窃案件图层中获取该图层所包含的案件个数。

接下来就到循环里的代码具体执行层面了。我们需要获取每一个案件,并给每一个案件创建1公里范围的缓冲区。如下图所示:





筛选的条件是根据要素的objectid来进行筛选(注意这个是比较特殊,因为这份数据的objectid是从1开始,正好和for循环输出的一样),这里的是一个变量,在模型构建器中,可通过以百分号 (%) 将替换变量括起来的方式,用一个变量的内容替换另一变量,简单说就是引用了另一个变量的值。



缓冲区这里需要注意的是,输出要素类也同样采用了变量的形式,意思就是输出的要素类名称根据变量的数值来定义,这样就确保每个输出的要素类名称都不一样,而且和每个案件的需要相关,提高可读性。

最终,就是找出每个缓冲区范围内的视频探头,如下图所示:



在这里我们用到的是裁剪这个工具。整个过程下来,会发现和编写代码的逻辑差不多,只是相对复杂,譬如要获取一个要素类中的要素时,要使用筛选工具。但是,ModuleBuilder直接提供了针对要素类循环获取每个要素的迭代器,如下图:





到这里才真正的恍然大悟,原来ModuleBuilder中的迭代器是针对Esri的地理信息模型(Geodatabase),看上图就可以知道,除了针对要素类的迭代之外,还提供了包括:要素集的迭代、字段的迭代、行的迭代、文件的迭代等等,使用这些迭代器就可以省去我们很多的工作,要理解这一点才能真正理解ModuleBuilder的强大之处。关于每个迭代器该如何选择,后续会再做详细的介绍。最后,你可能已经注意到,在我们构建的模型中,包含了内存工作工具和行内变量这两个知识点,如果对这块不太理解,可以看ArcMap的帮助文档,也可以给我留言,后续也会对这两个知识点进行探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息