1、前言 本文是五篇系列文章中的第三篇,希望能够更进一步地帮助您使用基本的Python和FME。在这篇文章里我们介绍了如何在FME Workbench中使用脚本化参数功能,并给大家准备了关于脚本化参数的两个演示示例。 2、介绍 当我们想基于已经派生或计算出的其他参数内容来重新设置一个新的FME参数时,脚本化参数就非常有用,例如,我们可以实现由用户自定义选择主题或图层组,然后通过脚本设置各个读取要素类型必须已存在于这些图层组中。 而对于编写Python脚本,FME模块中提供了许多FME变量,以及一个返回FME参数及其值的字典供用户选择调用。 这里需要注意的是,脚本化参数会在Python启动脚本和FME模板运行转换之前被执行。 3、示例1:编写Python脚本设置要读取的要素类型 (示例模板:ScriptedParameter1.fmwt) 本文提供的示例模板ScriptedParameter1.fmwt是脚本化要素类型以实现根据用户选择的组读取参数的典型示例。 
该工作空间将使用脚本参数有选择地读取要素类型 让我们来分析一下该模板如何通过脚本参数实现针对性读取要素的。 首先让我们通过“运行”>“带提示运行”查看已发布的参数,此时,一个带有全部参数的窗口将会出现。单击该窗口中的省略号以打开“选择'图层'”窗口,可以看到以下三个选项(如下图)。(请注意,您可以从中选择的图层是图层组):

用户通过发布的用户参数选择要读取的图层类型 这里,如果我们选择“步行和骑自行车”并运行工作空间,工作空间将同时读取Bikeways和PublicStreets要素类型(如下图)。 
接下来,让我们来看一下用于告诉FME如果用户选择“步行和骑自行车”,应将这两种要素类型都返回到“要读取的要素类型”参数中的脚本化参数。 转到在“导航器”窗口中,展开“用户参数”>“私有参数”,我们可以看到一个名为“feature_types_to_read”的Python脚本化参数(如下图)。请注意,该参数已链接到工作空间中读模块的实际“要读取的要素类型”参数上,所以根据脚本返回的值,AUTOCAD类型的读模块就会自动使用该值来确定要读取的要素类型。 
现在让我们返回到脚本化参数“feature_types_to_read”,双击它,然后单击省略号以打开编辑器,可以看到内部使用的python代码如下图: 
我们可以看到这里有一系列的if语句,这些语句都使用了fme.macroValues []字典找出用户选择的层,然后分别设置要返回的featureTypes的值。代码行中最后一行是最重要的,这是我们使用这些语句判断并最终“返回”脚本化参数实际值的地方(如下图): return featureTypes
该return语句必须始终存在于Python脚本化参数中,因为此处是将参数值提供给FME的地方。另外,脚本中注释掉的print功能,可以用于将变量值返回到“转换日志”窗口,这样可以帮助您调试脚本。 4、示例2:脚本化参数设置输出数据集唯一命名 (示例模板:ScriptedParameter2.fmwt) 接下来这个示例模板ScriptedParameter2.fmwt,是脚本化参数确保写出文件命名唯一性的典型示例。 这里我们实现确保写出文件命名唯一性的方法是使用脚本化参数将日期和时间附加到输出数据集名称上。 示例模板ScriptedParameter2.fmwt本身的功能是找到落在公园多边形内的点((设于公共场所的)自动饮水器),并输出成CSV文件(如下图)。而该模板实现确保写出文件命名唯一性的整体思路是,先接收输出数据集名称的发布参数,然后通过脚本编写,将唯一值(日期和时间)附加到发布参数值后。 
该工作空间将通过附加文件转换日期和时间来创建唯一命名的输出数据集 让我们来看一下具体是怎么实现的。 首先打开示例模板工作空间,并在确保启用了“带提示运行”(位于“运行”菜单下)模式下运行工作空间,此时将出现运行“参数”窗口,单击“确定”接受默认的输出数据集名称。如果需要,也可以修改参数,只是输出将与下面描述的稍有不同。 待工作空间运行完毕后,请查看“转换日志”窗口。在日志末尾的“Features Written Summary ”下,您将看到写入的输出csv文件的名称(如下图),它采用的是以下命名格式:<文件名> _ < YYYYMMDD > _ < HHMMSS >。其中<文件名>是已发布参数的值,< YYYYMMDD >是当前日期,而< HHMMSS >是工作空间运行的开始时间。 
通过使用脚本化参数附加日期和时间来创建唯一的输出数据集名称 接下来,让我们转到“导航器”>“用户参数”>“私有参数”>“nameWithTime”,然后双击以打开脚本编辑器,可以看到该脚本参数内部编写的代码(如下图): 
该脚本使用fme.macroValues []字典获取发布参数的值(文件名),并通过调用datetime.now()方法获取当前日期和时间。而后它连接这两个值,并使用return语句将唯一值(fileName_YYYYMMDD_HHMMSS)返回给编写器。这里同样需要注意的是,return语句必须始终存在于参数脚本中。 接下来,让我们转到“导航器”>“写模块[CSV2]”>“要素类型”>“ $(nameWithTime)”>“参数”>“常规”>“CSV文件名”。(请注意,CSV文件名已链接到私有参数nameWithTime(如下图))。 
CSV文件名参数链接到私有脚本参数nameWithTime,nameWithTime使用Python脚本创建唯一的文件名 (注意:其实无需使用脚本化的Python参数(例如,使用文本编辑器中可用的DateTimeNow()函数),也可以在输出文件名中添加日期和时间。) 5、测试数据来源 本文使用的数据来自不列颠哥伦比亚省温哥华市提供的开放数据。它包含根据“开放政府许可证-温哥华”获得许可的信息。 本文转载来自CSDN作者:fmechina 版权归作者所有 原文链接:https://blog.csdn.net/fmechina/article/details/114652110?spm=1001.2014.3001.5501 |