ArcGIS利用嵌套模型解决按多个行政区域裁剪多个矢量要素的问题
目标:利用模型构建器构建嵌套的两个模型,解决按照A要素的某一字段(如县域范围内的13个村庄范围)分别裁剪多个矢量文件(如道路、河流、用地等)
需要构建:①遍历所有待裁剪的要素的内层迭代;②遍历所有范围要素的外层迭代
数据准备:确保所有待裁剪要素位于同一文件夹/GDB中(个人推荐GDB,适用入库),范围要素中有明确区分各个区域的字段(不需要提前分割成n个要素)
注:熟练使用模型构建器的可直接跳转1.5和2.4照着最终结果构建即可。新人小白在看到2.5“运行”之前不要点运行,会自找麻烦。【xx】中的内容为补充或科普,选看。
一、内层迭代构建:
1.新建模型构建器:
2.插入迭代要素类,搜索裁剪工具拖入模型构建器(长按第二个拖到模型构建器中松手即可)
3.拖入待裁剪要素的文件夹/GDB,拖入范围要素,连接
结果如下图所示。其中迭代器输出的绿色椭圆(图中的DYXZQXS)为“裁剪”输入要素,总范围 为裁剪要素。双击迭代要素类,勾选递归;双击“裁剪”,设置输出路径,将输出名称命名为“%名称%”。【(如果没有安装汉化包则为%name%,与迭代器输出保持一致即可)(递归的意思是,如果你的文件夹里还有文件夹,或GDB中还有数据集,将遍历文件夹中的文件夹中的文件夹..中的所有要素,如不勾选就不往里深入遍历)】
4.按照图中所示,右键将待裁剪要素、范围要素和名称设置为参数。
5.保存模型。
可新建toolbox,我命名该模型为“一键裁剪”,至此完成内部迭代,可以实现按照一个矢量范围批量裁剪多个矢量数据。最终形态:
二、外层迭代构建:
1.新建模型构建器,插入迭代要素选择,将刚刚保存的“一键裁剪”模型拖进来。请注意,这里还需要一个特殊的工具叫做“复制要素”,同样是通过 搜索-拖入构建器 使用。拖入范围要素连接到迭代器。【“复制要素”可以转换要素为要素类,使迭代器的输出格式适配其他工具可输入的格式】
2.完成如图所示链接,将复制要素的输出命名为“%值%”。(范围要素→迭代要素选择,输出的→复制要素)
3.双击“迭代要素选择”,设置按照哪个字段分割要素范围。我这里是新建了“px”字段,内容填充就是1234...也可以用默认的FID等字段。双击复制要素设置一个输出路径。【(个人建议新建一个文件夹,这个输出只是中转数据,也就是按照字段将范围要素分割成了单个要素。至于为什么不提前按属性分割再用两次迭代要素类,我放在文章末尾说明)】
4.关键一步:
把“%值%”连接到“一键裁剪”,替代原本的范围要素。删掉那个孤独的原配。设置“一键裁剪”的输出结果名称为“%名称%_%值%”。【科普:“%xx%”中的内容叫做行内变量,不要用数字开头容易报错】
保存模型,最终形态如下:
5.提前建好你所有输出路径中新建的文件夹/GDB,如果多次运行模型,记得将上次每一步有输出的运行结果删掉,只留下空的文件夹/GDB;如果要保存到新的位置,则模型中的输出路径要同步改变。点“√”验证模型。好,现在可以运行了。我的结果如下:
范围要素按字段分割了,这个不重要
截取了一部分,后面需要分类再手动新建GDB批量导入即可。
6.所有的操作全都结束啦。中途如果有报错,仔细看看报错原因,排查是不是有 数字/汉字开头;输出路径和新建文件夹位置;递归没选;上次运行的结果有没有删掉(重名了就无法继续运行)等。
写在最后:我还尝试过先将范围要素分割成多个shp,再用迭代要素类*2的方式构建嵌套,结果问题出在两次输出都叫“名称”上,arcgis的底层运行逻辑是python,对于命名格式有着严格的要求,于是就没有继续尝试,但我觉得理论上应该可行(但是还麻烦一点,感觉本文的方法更快捷xixi)如果这篇文章有帮到你请积极点赞收藏关注哦!有任何疑问和不足之处也可以评论区讨论!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐









范围要素按字段分割了,这个不重要
截取了一部分,后面需要分类再手动新建GDB批量导入即可。

所有评论(0)