arcpy 帮助文档_Python toolbox(ArcPy) 执行结果如何自动添加到地图显示

本文介绍了如何使用Python Toolbox替代Model Builder创建ArcGIS GP服务,以实现更灵活的控制和错误排查。作者在实现过程中遇到GP服务结果无法自动显示到地图的问题,通过研究和尝试,找到了解决方案,关键在于设置`datatype="GPFeatureLayer"`和正确设置输出参数。

要用 ArcGIS API for JavaScript 做一个复杂的功能,比如导入CAD、更新地形图数据然后显示新地形图。这种功能最方便的实现方式就是用 Model Builder 建立模型、调试,然后发布GP服务,最后用 ArcGIS API for JavaScript 调用 GP 服务。

然而 GP Model 一旦报错,真的不好查找原因。GP 改动一下又要从头走一遍发布过程,真是心累。

所以我就开始研究使用 Python Toolbox 了。它通过(1) 编写Python toolbox脚本文件*.pyt;(2) 添加脚本到模型(2)调试(4)发布四个步骤得到一个 GP 服务。

8a9cbe929964b1396b30a607d7df22c0.png
pyt 文件以及模型

个人认为,代码更好控制,能看到更多细节,而 GP Model 隐藏了很多细节,出错了也不好排查。Pythton toolbox 还有一个好处是如果要修改 GP 服务,直接修改 *.pyt 文件去替换 ArcServer 中的文件即可,不需要重新发布服务。

关于使用 Python toolbox 实现一个 GP 服务的更多细节,可参考如下链接

https://blog.youkuaiyun.com/wucdsg/article/details/77100370​blog.youkuaiyun.com

这个脚本的思路大致是导入CAD到数据集,追加到现有数据。在我的实现过程中遇到了一个问题,就是如何将结果自动显示到地图,我需要在GP服务执行结束之后查看最新的地图。Model Builder 构建的模型会自动将结果显示到地图。

网上有提到用 arcpy.mapping.AddLayer 的,也有用 arcpy. MakeFeatureLayer_management 的,都不行。

例如以下两篇资料

The Esri Community​community.esri.comArcPy gives error Object: CreateObject cannot open map document?​gis.stackexchange.com
cd16a492b575c113588f5d3de1029067.png

我仔细对比了 arcpy 调用和 Model Builder 手工建模。追加工具一拖到 Model Builder 就有输出,而 arcpy 看不出来哪里有输出,

c5defd0a343681932ca4a432d8796d0c.png
Model Builder 添加 Append 工具

7bd4d907aefecc56b81189d7b3c8ab84.png
arcpy.Append_management 语法帮助文档

8219ddb4b4cb32464d31876d5aca5161.png
arcpy.Append_management: PolygonPath 和 output_polygon 都算是输入

从代码的层面完全看不出来,Model Builder 里面那个输出是怎么来的。我尝试过在代码里面使用 return 语句,也不行。

还查了 arcpy.Append_management show result,没有得到结果。

690f1d81d7fd8afaae9889f88016755c.png

最终,偶然间看到一句代码,解决了我的问题。

......
    def getParameterInfo(self):
        output_polygon = arcpy.Parameter(
            displayName="outputPolygon",
            name="outputPolygon",
            direction="Output",
            datatype="GPFeatureLayer", # 必须是这个类型才会自动显示结果到地图中
            parameterType='Derived', 
            enabled=True,
            category=None, 
            symbology=None, 
            multiValue=False
        )
        
        params = [output_polygon]
        return params

......
    def execute(self, parameters, messages):
        output_polygon = os.path.join(m_workspace,"res.gdb/CAD/Polygon")
        PolygonPath = os.path.join(m_workspace,"prj.gdb/CAD/Polygon")
        
        arcpy.Append_management(
            PolygonPath,
            output_polygon,
            "NO_TEST"
        )
        
        parameters[0].value = output_polygon # 这样才能自动显示结果到地图,发布GP时才能携带结果地图服务
        
        return

其中 datatype="GPFeatureLayer" 和 parameters[0].value = output_polygon 这两句很关键,折腾了一天。datatype="GPFeatureLayer" 是早上查资料发现的,我之前的参数是字符串,后来才明白,想要显示的话,字符串怎么可能会显示到地图上。parameters[0].value = output_polygon 是下午查资料偶然看到的。这里卡了我很久。

到此问题算是解决了,第一次用 Python toolbox,踩坑不易,还好坚持下来了。

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值