span8号
斯潘4
本文是由5部分组成的系列文章的第4部分,旨在帮助您开始基本的Python和FME。本文是关于在工作台中使用pythoncaller变压器的,包括三个使用功能或班分别。
这个皮通卡勒变压器允许您使用Python脚本对功能或功能组进行操作。在使用这个变压器之前,请确保没有一个FME变压器可以完成您想要做的任务。浏览FME变压器廊道或询问FME社区亚搏国际在线官网FME知识中心问答论坛看看有没有变压器可以帮助你。
pythoncaller可以调用一个函数,您可以使用该函数一次处理一个特性,或者调用一个类,在该类中,您可以对特性组执行操作。pythoncaller可以使用所有的FME对象,包括许多方法和类。
通过使用FME对象python api中的FME类和方法,可以在python脚本中使用FME的许多核心功能。有关fme对象python api的更多信息,请看简介python和fme基础文章。
附加工作区:pythoncaller 1.fmw
和所有变压器一样,FME工作台将包含一个按钮,用于在参数编辑器窗格。在这种情况下,我们将使用包含在蟒蛇帮助下函数接口示例向功能添加时间戳的部分。这不是蟒蛇因为这个任务可以用标准的FME日期时间篡改变压器完成。然而,这是一个简单但有效的例子,演示了如何使用变压器。
您可以通过使用示例创建自己的工作区来执行该练习,也可以查看最终工作区。(蟒蛇1.fmw)可以在上面的下载部分找到。
pythoncaller函数接口示例来自pythoncaller transformer帮助文档。
添加一个蟒蛇转换到您的工作区并选择它。你应该看到参数编辑器位于工作台窗口左下角的窗格。如果你看不到它,可能在左边有一个标签。翻译日志或者你可以从菜单打开它视图>窗口>参数编辑器.
关于如何访问pythoncaller的python脚本编辑器窗口的说明。
单击右边的省略号蟒蛇脚本用于打开代码编辑器的参数。注意,已经有了一个模板函数和类。删除班模板,因为我们只是使用功能现在。重命名函数时间戳功能并从蟒蛇帮助页面功能界面示例部分或从下面。您可能需要在代码中添加一些换行符和缩进,使代码看起来像这样(记住,在python中缩进内容):
导入fmeobjectsimport time模板函数接口:def timestamp feature(feature):curtime=time.ctime(time.time())feature.setattribute(“timestamp”,宵禁时间)
脚本使用了一个FME对象方法,因此我们需要导入FmeObjects既然我们用的是蟒蛇时间模块,我们也需要进口。函数定义接受FME-特征对象作为其唯一参数,这意味着所有功能将逐个进入功能进行处理。
将新属性添加到功能设置属性()方法对特征-这实际上是一个FME对象方法。单击“确定”关闭代码编辑器。
在同一个窗格中,设置要处理功能的类或函数函数名称的参数:时间戳功能.因为我们添加了一个名为时间戳我们可以通过在要公开的属性参数。要公开新属性,双击字段或单击省略号,并在输入要公开的属性的值窗口。
在何处指定要在pythoncaller中使用的类或函数,以及如何公开由使用的python脚本创建的属性。
使用Creator Transformer创建一些要发送给pythoncaller的特性,并使用记录器查看输出。运行工作区并查看翻译日志翻译完成后的窗格。您可能需要向上滚动以查看记录的功能。每个特性都应该有一个时间戳属性。
使用翻译日志窗格中的pythoncaller函数查看添加到每个功能的属性。
附加工作区:pythoncaller 2.fmw
FME集线器包括一个名为引信比较器它使用了巨蟒迪夫利布模块比较两个字符串属性并计算相似性比率。在某些方面,这是一个更好的例子,因为这是我们不能用常规的FME变压器做的事情。您可以查看最终工作区(蟒蛇2.fmwt)可以在上面的下载部分找到。
打开一个空白工作区并为您的数据类型添加一个读卡器。添加一个attributeManager并为相似性比率创建一个新属性。找到FME集线器变压器引信比较器通过在画布上键入变压器名称或浏览FME集线器变压器变压器廊道窗格。将其添加到工作区。
在Transformer Gallery窗格中查找FuzzyStringComparer的位置。
选择要比较的两个字符串属性,然后输入相似性比率的名称。此名称应与在工作流早期使用attributeManager创建的新属性匹配。亚搏在线
选择变压器,右键单击并选择编辑查看其内容。将打开一个新的画布窗格选项卡。找到蟒蛇转换并转到其属性以访问脚本编辑器。下面的代码可能看起来相当复杂,但与第一个示例有相似之处。
就本例而言,我们只关注直接相关代码的部分。再次注意,我们使用的是一个函数——这次是基于一个特性一个特性比较字符串属性。我们得到两个字符串属性feature.getattribute()。并将其定义为STRIGE1和字符串2分别。字符串与difflib.sequencematcher类和SequenceMatcher对象被创建。通过调用序列分析器对象的比率()方法,返回测量两个字符串相似性的比率。我们再次创建了一个名为模糊系统比较分配比率值。
import difflibimport sysdef fuzzystringcompare(feature):从attributesstring1=feature.getattribute('fuzzystringcompare.string1')string2=feature.getattribute('fuzzystringcompare.string2')version=sys.version_info[0]if string1!=无和字符串2!=无:如果版本>2,必要时转换为Unicode字符串:如果不是IsInstance(String1,str):string1=''。如果不是isinstance,则格式化(string1)(string2,str):string2=''。格式(string2)否则:如果不是isinstance(string1,unicode):string1=u''。如果不是isinstance,则格式化(string1)(string2,unicode):string2=u''。format(string2)calculate difference ratio s=difflib.sequencematcher(none,string1.lower(),string2.lower())ratio=s.ratio()update input stringsdiffer=difflib.ndiff(string1,string2)diff1='diff2='for line in differ:if line[0]='-':diff1=diff1+(line[2])diff2=diff2+''elif line[0]='+':diff1=diff1+''diff2=diff2+(第[2]行),否则:diff1=diff1+(第[2]行),diff2=diff2+(第[2]行),在featureFeature.setattribute('fuzzystringCompare.ratio',ratio)feature.setattribute('fuzzystringCompare.string1',diff1)feature.setattribute('fuzzystringCompare.string2',diff2)上设置新属性
像前面的例子一样,这个蟒蛇参数对话框显示蟒蛇变压器功能调用和属性以公开。因为这是一个定制变压器,该字段将预先填充“fuzzystringCompare”(名称为功能)以及属性'模糊系统比较.ratio'(包含相似性比率的属性名)。安属性创建器稍后在自定义转换器工作流中用于访问我们创建和公开的属性。亚搏在线
请记住指定pythoncaller中使用的类或函数,并公开在pythoncaller中创建的任何属性。
连接检查器以查看输出。运行工作区并查看输出。您将看到一个值范围为0到1.0的新属性,它表示您指定的两个字符串属性之间的相似性比率。
注意:如果引信比较器自定义变压器与上面的不同,您很可能下载了不同版本的自定义转换器。本文使用了第5版的Transformer。然而,原则应该或多或少保持不变。
附加工作区:pythoncaller 3.fmw
我们将再次使用Transformer帮助页的类接口示例部分中提供的示例蟒蛇.这次我们将使用一个类而不是函数来计算所有功能的面积。这项任务是一个可以很容易地完成与变压器在FME。然而,这里我们向您展示如何使用Python来突出显示流程。
对于已完成的工作区,请使用蟒蛇3.fmw从上面的下载部分。
pythoncaller Transformer帮助文档中的pythoncaller类接口示例
启动新的空白工作区并使用造物主变换以创建多边形特征。要创建特征,打开造物主参数,双击几何对象,选择多边形,在下面至少添加三个坐标几何参数。添加一个蟒蛇变压器和连接记录器以查看输出。
打开蟒蛇并在代码编辑器中打开脚本。如果要创建工作区,从Transformer帮助页中的示例或从下面复制代码。您可能需要在代码中添加一些换行和缩进,以便看起来像这样(记住在python中缩进很重要):
导入fmeobjectsClass FeatureProcessor(对象):def u init_uuuu(self):self.featureList=[]self.totalArea=0.0 def输入(self,feature):self.featureList.append(feature)self.totalArea+=feature.getGeometry().getArea()def close(self):用于self.featureList中的功能:feature.setAttribute(“总面积”,self.totalarea)self.pyoutput(功能)
我们再次使用了许多FME对象方法,因此我们需要导入FmeObjects.在输入方法,我们将每个功能添加到一个列表中,并从添加到总面积.在关闭方法循环遍历每个特征并设置总面积致总面积每个属性的属性。重要的是要注意,如果我们希望功能在工作区中继续运行,则必须使用PyOutPutt()方法。
单击“确定”关闭代码编辑器。在变压器中,你需要设置用于处理功能的类或函数到类的名称:功能处理器.因为我们添加了一个名为总面积我们可以通过在要公开的属性参数。
请记住指定pythoncaller中使用的类或函数,并公开在pythoncaller中创建的任何属性。
运行工作区以确保总面积属性。打开造物主变压器和增加功能的数量。再次运行工作区,查看是否已计算出所有功能的总面积。
检查“翻译日志”窗格以验证计算的累计面积是否正确。增加为再次验证而创建的功能的数量。
附加工作区:pythoncaller 4.fmwt
这个KML文件夹文章在kml转换教程中,概述了创建kml文件夹的两种不同方法,在GoogleEarthPlaces窗格中定义嵌套的树结构。第二种方法使用kml id定义自定义层次结构,直接控制文件夹命名,亲子关系,和文件夹级别。
为每个文件夹级别中的每个文件夹手动定义一个自定义文件夹层次结构,其中包含attributeCreators
然而,使用创建者为每个文件夹创建一个空的几何记录,并使用attributeCreator或attributeManager设置kml_id号,KMLY-亲本,KMLL文档每个文件夹的属性都是耗时和劳动密集型的。使用一些转换器来准备数据和一个python类,您可以自动化并使这个过程更加数据驱动。
对于已完成的工作区,请使用蟒蛇4.fmwt从上面的下载部分。
启动一个新的空白工作区,并将阅读器添加到画布中。输入功能有两个流,一个用于编写包含几何图形的功能,另一个用于定义和创建kml文件夹。在这个例子中,我们将集中在第二条河流上。
添加一个几何去除剂和一个属性管理器.这个过程的关键是找到每个级别需要创建的每个文件夹。要查找第一级和第二级文件夹的所有可能组合,创建一个由二级文件夹属性和一级文件夹属性(示例工作区中的犯罪类型和邻居)组成的串联字符串,并在属性管理器.
使用两个值之间的分隔符创建2级和1级文件夹属性的串联字符串值。
添加唯一值记录器自定义变压器并设置要分析的属性参数设置为在属性管理器.这是用来找出所有独特的组合的第二和第一级属性(犯罪类型和邻里价值)。添加一个蟒蛇并添加以下脚本:
导入fmeimport fmeobjects模板类接口:使用此类时,确保其名称设置为“要处理功能的类或函数”的值Transformer参数Class FeatureProcessor(Object):def u init uuu(Self):self.FeatureList=[]def input(Self,Feature):self.FeatureList.Append(Feature)def close(Self):for feature in self.FeatureList:ListAttr=Feature.getattribute(“值”)feature.setattribute(“kml_id”,listattr)feature.setattribute(“kml_name”,listattr.rpartition(';;')[0])feature.setattribute(“kml_parent”,listattr.rpartition(';;')[-1])self.pyoutput(feature)
脚本导入FME-对象模块,因为它使用了FME对象方法。列表在中初始化爱因斯坦函数和功能将添加到此列表中输入函数使用追加方法。
在关闭函数,我们遍历功能列表,并使用GET属性()方法。
要确定要创建的文件夹的名称,我们使用kml_名称属性。使用再分方法的值,我们在分隔符/分隔符(示例中为“;”)处拆分该特性,并设置第一个元素,表示为listattr.rpartition(';;')[0],作为价值kml_名称(犯罪类型,在示例工作区中)。注意:是否使用第一个或最后一个元素将取决于连接字符串的结构。通过检查输出功能,确保使用正确的值。
同样地,要确定父文件夹,我们使用KML-亲本属性。而不是使用再分,我们使用最后一个元素〔1〕.此外,由于每个文件夹功能必须具有唯一的ID值,我们将连接的第一级和第二级字符串值设置为KMLYID.
因为我们需要为每个功能创建一个文件夹,我们需要使用self.pyoutput(功能)以确保空文件夹功能在工作区中继续。记住公开KML编写器所需的属性,例如kml_id号,KMLIN名称,和KML-亲本内蟒蛇.
第一级文件夹相对简单,因为它只需要第一级属性的每个唯一值。在这个例子中,这就是邻里价值。再一次,我们使用唯一值记录器查找唯一的一级文件夹属性。使用上面类似的python脚本,我们可以将唯一属性值设置为KMLYID和kml_名称.不必设置KML-亲本对于一级文件夹。
为功能类型“folders”添加一个kml writer,并连接蟒蛇给这位作家。然后,此功能类型编写器将为您的功能创建自定义文件夹层次结构。
工作区中的第二个流,它使用数据的属性定义自定义文件夹层次结构。
要将特征(与几何图形)与相应的父文件夹相关联,创建一个KML-亲本属性,并将值设置为KMLYID使用属性管理器.在示例工作区中,它将是2级文件夹属性和1级文件夹属性值的串联字符串(@值(类型);;@value(邻居)在已完成的工作区中)。添加另一个kml feature type writer并连接属性管理器.
亚搏在线使用kml_父属性将功能与相应的父文件夹关联的工作流。
运行工作区并在GoogleEarth中打开生成的kml文件。已创建自定义文件夹层次结构,并且您的功能与父文件夹相关联,允许数据组织和易于查看。
通过使用UniqueValueLogger自定义转换器和Python脚本的数据驱动进程创建的自定义kml文件夹层次结构查看Google Earth中的数据。
python相关的transformers在fme workbench中有很好的帮助,可以在帮助>fme transformers中访问。或者直接右键单击工作台画布中的Transformer并选择帮助(在菜单底部)。
您可以在这里找到python FME对象API的完整文档:fme对象python api
此处使用的数据源于温哥华市,不列颠哥伦比亚省。它包含根据开放政府许可证(温哥华)获得许可的信息。
?2019安全亚搏在线软件公司|合法的