西班牙
斯潘4
本文是由5部分组成的系列文章的第4部分,帮助您开始使用基本的Python和FME。本文是关于在Workbench中使用PythonCaller transformer的文章,包括使用函数或类分别是。
这个PythonCaller变压器允许您使用Python脚本对功能或功能组执行操作。在使用此转换器之前,请确保没有执行您要执行的任务的FME转换器。浏览FME变压器画廊或者询问FME社区亚搏国际在线官网FME知识中心问答论坛看看是否有变压器可以帮助你。
PythonCaller可以调用一个函数,您可以使用该函数一次处理一个功能,或者调用一个类,在该类中您可能希望对功能组执行操作。PythonCaller可以使用各种FME对象,包括许多方法和类。
通过使用FME对象Python API中的FME类和方法,可以在Python脚本中使用FME的许多核心功能。有关FME Objects Python API的更多信息,请参见Python和FME基础文章。
附加工作区:PythonCaller1.fmw
与所有变压器一样,FME工作台将包含一个按钮,用于参数编辑器窗格。在这种情况下,我们将使用PythonCaller帮助下函数接口的例子节向功能添加时间戳。对于PythonCaller因为这个任务可以用标准的FME日期时间戳转换器来完成。不过,这是一个简单但有效的示例,演示了如何使用转换器。
您可以通过使用示例创建自己的工作区来完成练习,也可以查看最终的工作区(PythonCaller1.fmw)可以在上面的下载部分找到。
来自PythonCaller帮助文档的PythonCaller函数接口示例。
添加PythonCaller转换到您的工作区并选择它。你应该看看参数编辑器位于工作台窗口左下角的窗格。如果你看不到它,可能在翻译日志或者你可以从菜单上打开它查看> Windows >参数编辑器.
有关如何访问Python脚本编辑器窗口的说明。
点击右边的省略号Python脚本参数打开代码编辑器。注意这里已经有一个模板函数和类。删除类模板,因为我们正在使用函数现在。重命名函数timestampFeature并从PythonCaller帮助页面功能界面示例部分或从下面。您可能需要在代码中添加一些行返回和缩进,使其看起来像这样(记住,缩进在Python中很重要):
导入fmeobjects导入time模板函数接口:def timestampFeature(特性):curTime = time.ctime(time.time())特性。setAttribute(“时间戳”,curTime)
该脚本使用一个FME对象方法,所以我们需要进口fmeobjects因为我们用的是Python时间模块,我们也需要导入它。函数定义接受FMEFeature对象作为其惟一的参数,这意味着所有特性都将一个接一个地进入函数进行处理。
新属性被添加到特性中setAttribute ()这实际上是一个FME对象方法。单击OK关闭代码编辑器。
在同一窗格中设置类或函数来处理特性参数到函数的名称:timestampFeature.因为我们添加了一个名为的新属性时间戳我们可以通过在属性暴露参数。若要公开新属性,请双击字段或单击省略号,并在输入要公开的属性的值窗口。
在何处指定要在PythonCaller中使用的类或函数,以及如何公开由使用的Python脚本创建的属性。
使用Creator transformer创建一些特性发送给PythonCaller,使用Logger查看输出。运行工作区并查看翻译日志翻译完成后的窗格。您可能需要向上滚动才能看到记录的特性。每个特性都应该有一个时间戳属性。
在翻译日志窗格中使用PythonCaller函数查看添加到每个功能的属性。
附加工作区:PythonCaller2.fmw
FME集线器包含一个自定义转换器,称为模糊比较器使用了Pythondifflib语言模块比较两个字符串属性并计算相似比。在某些方面,这是一个更好的例子,因为这是我们不能用一个普通的FME变压器。您可以查看最终的工作区(蟒蛇2.fmwt)可以在上面的下载部分找到。
打开空白工作区并为您的数据类型添加一个阅读器。添加一个AttributeManager并为相似性比率创建一个新属性。找到FME集线器变压器模糊比较器在画布上键入转换器名称或浏览FME集线器变形金刚的变压器廊道窗格。将其添加到工作区。
在Transformer Gallery窗格中找到FuzzyStringComparer的位置。
选择您想要比较的两个字符串属性,并输入您想要的名称作为相似性比率。这个名称应该与工作流中先前使用AttributeManager创建的新属性相匹配。亚搏在线
选择transformer,右键单击它并选择编辑查看其内容。将打开一个新的画布窗格选项卡。定位PythonCaller并转到其属性以访问脚本编辑器。下面的代码可能看起来相当复杂,但它与第一个示例之间有相似之处。
对于本例,我们将只关注直接相关的代码部分。再次注意,我们使用了一个函数——这一次是在一个特性的基础上比较字符串属性。我们得到两个字符串属性feature.getAttribute()将它们定义为字符串1和字符串2分别是。将字符串与difflib.SequenceMatcher程序匹配器类和一个SequenceMatcher对象被创建。通过调用序列匹配器对象的比率()方法,返回一个度量两个字符串相似性的比率。我们再次创建了一个名为的新属性FuzzyStringCompare.比率,它被赋值为比值。
从属性string1 = feature.getAttribute('FuzzyStringCompare.string1')中获取字符串,string2 = feature.getAttribute('FuzzyStringCompare.string2')版本= sys。version_info[0] if string1 != None and string2 != None: # convert to unicode strings if necessary if version > 2: if not isinstance(string1, str): string1 = '{}'.format(string1) if not isinstance(string2, str): string2 = '{}'.format(string2) else: if not isinstance(string1, unicode): string1 = u'{}'.format(string1) if not isinstance(string2, unicode): string2 = u'{}'.format(string2) # calculate difference ratio s = difflib.SequenceMatcher(None,string1.lower(),string2.lower()) ratio = s.ratio() # update input strings differ = 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 + (line[2]) else: diff1 = diff1 + (line[2]) diff2 = diff2 + (line[2]) # set new attributes on feature feature.setAttribute('FuzzyStringCompare.ratio',ratio) feature.setAttribute('FuzzyStringCompare.string1',diff1) feature.setAttribute('FuzzyStringCompare.string2',diff2)
与前面的示例类似,thePythonCaller参数对话框告诉PythonCaller变压器的函数调用和属性来公开。由于这是一个自定义转换器,因此字段将已经预先填充了'FuzzyStringCompare' (name of)函数)和属性'FuzzyStringCompare.ratio的(属性名,包含相似比)。一个属性创建者稍后在自定义转换器工作流中使用,以访问我们创建和公开的属性。亚搏在线
请记住指定PythonCaller中使用的类或函数,并公开PythonCaller中创建的任何属性。
连接检查器以查看输出。运行工作区并查看输出。您将看到一个新属性,其值从0到1.0,表示您指定的两个字符串属性之间的相似度。
注:如果Python代码中模糊比较器自定义transformer与上面的不同,您很可能下载了自定义transformer的不同版本。本文使用的是transformer的版本5。然而,原则应该或多或少保持不变。
附加工作区:PythonCaller3.fmw
我们将再次使用转换器帮助页面上的类接口示例部分提供的示例PythonCaller.这一次,我们将使用一个类而不是一个函数来计算所有特性的面积。这个任务是一个可以很容易地在FME的变压器。但是,这里我们将向您展示如何使用Python实现这一点,以突出显示该过程。
对于完成的工作空间,请使用蟒蛇3.fmw从上面的下载部分。
PythonCaller transformer帮助文档中的PythonCaller类接口示例
启动一个新的空白工作区并使用造物主使用transformer创建多边形特性。若要创建功能,请打开造物主参数,双击几何体对象中,选择多边形,并在下面添加至少三个坐标几何参数。添加PythonCaller变压器连接a记录器查看输出。
打开PythonCaller并在代码编辑器中打开脚本。如果您正在创建工作区,请从Transformer帮助页面或下面的示例中复制代码。你可能需要添加一些行返回和缩进的代码,这样看起来像这样(记住缩进的问题在Python):
导入fmeobjects类FeatureProcessor(object): def _init__(self): self。featureList = [] self。totalArea = 0.0 def input(self,feature): self.featureList.append(feature) self.totalArea += feature.getGeometry().getArea() def close(self): for feature in self.featureList: feature.setAttribute("total_area", self.totalArea) self.pyoutput(feature)
我们再次使用了许多FME对象方法,所以我们需要这样做进口fmeobjects.在输入方法,我们将每个特性添加到列表中,并从添加到的每个特性中获取区域总面积.在关闭方法循环遍历每个特性并设置值总面积到总面积每个属性的属性。重要的是要注意,如果我们希望特性在工作空间中继续,则必须使用pyoutput()方法。
单击OK关闭代码编辑器。在转换器中,您需要设置处理特征的类或函数到类名:功能处理器.因为我们添加了一个名为的新属性总面积我们可以通过在属性暴露参数。
请记住指定PythonCaller中使用的类或函数,并公开PythonCaller中创建的任何属性。
运行工作区以确保您拥有总面积属性。打开造物主增加了变压器的数量和功能。再次运行工作区,以查看所有功能的总面积是否已经计算完毕。
检查“转换日志”窗格以验证计算的累积面积是否正确。增加为再次验证而创建的要素的数量。
附加工作区:PythonCaller4.fmwt
这KML文件夹文章KML转换教程中概述了创建KML文件夹的两种不同方法,它们定义了谷歌Earth Places窗格中的嵌套树结构。第二种方法使用KML id定义自定义层次结构,直接控制文件夹命名、父子关系和文件夹级别。
手动定义自定义文件夹层次结构,每个文件夹级别中的每个文件夹都有属性创建器
但是,使用创建者为每个文件夹创建空几何记录,并使用AttributeCreator或AttributeManager设置kmlôu id、kmlôu父级、kmlôu文档每个文件夹的属性可能非常耗时和费力。使用一些准备数据的转换器和一个Python类,您可以自动化并使这个过程更加数据驱动。
对于完成的工作空间,请使用蟒蛇4.fmwt从上面的下载部分。
启动一个新的空白工作区,并将您的阅读器添加到画布中。输入特性有两个流,一个用于编写包含几何图形的特性,另一个用于定义和创建KML文件夹。在本例中,我们将关注第二个流。
添加GeometryRemover公司和一个属性管理器.这个过程的关键是找到需要为每个级别创建的每个文件夹。要查找第1级和第2级文件夹的所有可能组合,请在属性管理器.
使用两个值之间的分隔符创建二级和一级文件夹属性的串联字符串值。
添加唯一值记录器自定义变压器和设置要分析的属性属性中创建的连接字符串值的属性管理器.这是用来找出所有独特的组合的第2和第1级属性(犯罪类型和邻里价值观)。添加PythonCaller并添加以下脚本:
当使用这个类时,确保它的名字被设置为‘类或函数来处理特性’的值。def close(self): for feature in self。listAttr = feature. getattribute ('_value')特性。setAttribute (“kml_id listAttr)特性。setAttribute("kml_name", listAttr.rpartition(';;')[0]) feature.setAttribute("kml_parent", listAttr.rpartition(';;')[-1]) self.pyoutput(feature)
脚本导入fmeobjects对象模块,因为它使用FME对象方法。类中初始化列表__初始__的列表中添加了功能和特性输入函数使用追加方法。
在关闭方法,我们遍历特性列表,并使用获取属性()方法。
要确定要创建的文件夹的名称,我们使用国名属性。使用分割方法对连接的字符串值,我们在分隔符/分隔符处拆分特性(在示例中为';;'),并设置第一个元素,表示为listAttr.rpartition(';;')[0]的值国名(犯罪类型,在示例工作区中)。注意:使用第一个元素还是最后一个元素取决于连接字符串的结构。通过检查输出特性,确保使用了正确的值。
类似地,要确定父文件夹,我们使用家长属性。而不是使用第一个元素分割,我们使用最后一个元素[-1].此外,由于每个文件夹特性必须具有惟一的ID值,所以我们将连接的第一级和第二级字符串值设置为克米尔.
因为我们需要为每个特性创建一个文件夹,所以我们需要使用self.pyoutput(特性)以确保空文件夹功能在工作区中继续。记住要公开KML写入器所需的属性,比如kmlôu id,kmlôu name,和家长在PythonCaller.
第一级文件夹相对比较简单,因为它只需要第一级属性的每个惟一值。在这个例子中,这是邻域值。我们再次使用唯一值记录器查找唯一的一级文件夹属性。使用与上面类似的Python脚本,我们可以将unique属性值设置为克米尔和国名.没有必要设置家长用于第一级文件夹。
属性类型“文件夹”的KML写入器,并连接属性的输出蟒蛇这个作家。然后,此功能类型编写器将为您的功能创建自定义文件夹层次结构。
工作区中的第二个流,它使用数据的属性定义自定义文件夹层次结构。
要将您的特性(与几何图形)与适当的父文件夹相关联,请创建一个家长属性,并将其值设置为克米尔要将功能定位在其中的文件夹中,请使用属性管理器.在示例工作区中,它是第2级文件夹属性和第1级文件夹属性值(@值(类型);@Value(邻域)在完成的工作区中)。的输出属性管理器.
亚搏在线使用kml_parent属性将要素与相应父文件夹关联的工作流。
运行工作区并在谷歌Earth中打开生成的KML文件。创建了自定义文件夹层次结构,并将您的功能与父文件夹相关联,以便进行数据组织并易于查看。
使用UniqueValueLogger自定义转换器和Python脚本,通过数据驱动进程创建自定义KML文件夹层次结构的Google Earth中的数据视图。
与python相关的transformer在FME Workbench中有很好的帮助,可以在Help > FME transformer中访问它,或者直接在Workbench画布中右键单击transformer并选择Help(在菜单的底部)。
你可以在这里找到Python FME Objects API的完整文档:FME对象Python API
这里使用的数据来源于由温哥华市不列颠哥伦比亚省。它包含在开放政府许可下的信息-温哥华。
?2019安全亚搏在线软件公司|合法的