span8
span4
本文是由5部分组成的系列文章的第4部分,帮助您开始学习基本的Python和FME。本文是关于在工作台中使用PythonCaller转换器的,并包括使用a的PythonCaller转换器的三个不同应用程序示例功能或类分别。
的PythonCaller变压器允许您使用Python脚本处理特性或特性组。在使用这个变压器之前,请确保没有一个FME变压器已经做你想做的任务。浏览FME变压器图库或者问问FME社区亚搏国际在线官网FME知识中心Q&A论坛看看有没有变压器可以帮助你。
PythonCaller可以调用一个函数,您可以使用它一次处理一个特性,也可以调用一个类,您可以对一组特性进行处理。PythonCaller可以使用所有的FME对象,包括许多方法和类。
通过使用FME对象Python API中的FME类和方法,可以在Python脚本中使用FME的许多核心功能。有关FME对象Python API的更多信息,请参阅介绍Python和FME基础篇文章。
附工作区:PythonCaller1.fmw
与所有的转换器一样,FME工作台将包含一个用于特定转换器帮助的按钮参数编辑器窗格。在本例中,我们将使用包含在PythonCaller帮助下功能接口实施例部分向特性添加时间戳。这不是一个理想的用途PythonCaller因为这个任务可以用标准的FME DateTimeStamper转换器来完成。然而,这是一个演示如何使用transformer的简单而有效的示例。
您可以使用示例创建自己的工作空间,或者查看最终的工作空间(PythonCaller1.fmw),可在上述下载部分找到。
从PythonCaller变压器帮助文档PythonCaller功能界面的例子。
添加一个PythonCallertransformer到您的工作空间并选择它。你应该看看参数编辑器位于工作台窗口左下角的窗格。如果你没有看到它可能有一个标签为它的左边转换日志窗口,也可以从菜单中打开它视图>窗口>参数编辑器.
研究机构Directions on如何访问Python的脚本编辑器窗口PythonCaller。
属性右边的省略号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的版本5。然而,这一原则应该大致保持不变。
附加工作区:PythonCaller3.fmw
同样,我们将使用Transformer帮助页的类接口示例部分中提供的示例PythonCaller.这次我们将使用类而不是函数来计算所有特征的面积。这项任务是一个可以很容易地完成与变压器在FME。但是,这里我们将向您展示如何使用Python来突出显示流程。
对于已完成的工作区,请使用蟒蛇3.fmw从上面的下载部分。
PythonCaller transformer帮助文档中的PythonCaller类接口示例
启动新的空白工作区并使用造物主转换以创建多边形特征。要创建特征,请打开造物主参数,双击几何体对象,选择多边形,并在下面添加至少三个坐标几何参数。添加一个PythonCaller变压器和连接记录器以查看输出。
打开PythonCaller在代码编辑器中打开脚本。如果要创建工作区,请从Transformer帮助页中的示例或从下面复制代码。您可能需要在代码中添加一些行返回和缩进,以便看起来像这样(记住缩进在Python中很重要):
导入fmeobjects类FeatureProcessor(object):def\uu init(self):self.featureList=[]self.total area=0.0def输入(self,feature):self.featureList.append(feature)self.totalArea+=feature.getGeometry().getArea()def close(self):对于self.featureList中的功能:feature.setAttribute(“totalArea”,self.totalArea)self.pyoutput(feature)
我们再次使用了许多FME对象方法,因此我们需要进口fmeobjects.在输入方法,我们将每个特征添加到列表中,并从添加到总面积.在关闭方法循环遍历每个特征并设置总面积致总面积每个属性的属性。需要注意的是,如果我们希望功能在工作区中继续运行,则必须使用pyoutput()方法。
单击“确定”关闭代码编辑器。在变压器中,您需要设置处理特征的类或函数致班级名称:功能处理器.因为我们添加了一个名为的新属性总面积我们可以通过在属性揭露参数。
请记住指定PythonCaller中使用的类或函数,并公开PythonCaller中创建的任何属性。
运行工作区以确保总面积你的特征。打开造物主变压器和增加功能的数量。再次运行工作区以查看所有功能的总面积已计算完毕。
检查“转换日志”窗格以验证计算的累积面积是否正确。增加为再次验证而创建的要素的数量。
附加工作区:PythonCaller4.fmwt
这个KML文件夹文章KML转换教程中概述了创建KML文件夹的两种不同方法,这两种方法在Google Earth Places窗格中定义了嵌套树结构。第二种方法使用KML id定义自定义层次结构,直接控制文件夹命名、父子关系和文件夹级别。
手动定义自定义文件夹层次结构,每个文件夹级别中的每个文件夹都有属性创建器
但是,使用创建者为每个文件夹创建空几何体记录,并使用AttributeCreator或AttributeManager设置kmlôu id、kmlôu父级、kmlôu文档每个文件夹的属性都可能是费时费力的。有了一些准备数据的转换器和Python类,您可以自动化并使这个过程更加数据驱动。
对于已完成的工作区,请使用蟒蛇4.fmwt从上面的下载部分。
启动一个新的空白工作区并将您的阅读器添加到画布中。输入特性有两个流,一个流将写入包含几何图形的特性,另一个流将定义和创建KML文件夹。在这个例子中,我们将关注第二个流。
添加一个GeometryRemover公司还有一个属性管理器.此过程的关键是查找每个级别需要创建的每个文件夹。若要查找一级和二级文件夹的每个可能组合,请创建一个二级文件夹属性和一级文件夹属性(示例工作区中的犯罪类型和邻居)的串联字符串,并在属性管理器.
使用两个值之间的分隔符创建二级和一级文件夹属性的串联字符串值。
添加唯一值记录器自定义转换器并设置要分析的属性中创建的连接字符串值的参数属性管理器.这用于查找第二级和第一级属性(犯罪类型和邻里值)的所有唯一组合。添加一个PythonCaller并添加以下脚本:
import fme import fmeobjects#Template Class Interface:#使用此类时,请确保将其名称设置为#处理功能的类或函数'转换器参数类FeatureProcessor(object):def#u init#uu(self):self.featureList=[]def input(self,功能:self.featureList.append(feature)def close(self):对于self.featureList中的功能:listAttr=feature.getAttribute(''u value')feature.setAttribute(“kml_id”,listAttr)feature.setAttribute(“kml_name”,listAttr.rpartition(';')[0])feature.setAttribute(“kml_parent”,listAttr.rpartition(';')[-1])self.pyoutput(功能)
脚本导入fmeobjects对象模块使用FME对象方法。列表在__初始__函数和功能将添加到此列表中输入函数使用追加方法。
在关闭功能,我们通过迭代的特征列表,并为每一个特征(“_value”)使用所述获得的(犯罪类型和邻居在该示例工作区)串联的字符串值获取属性()方法。
为了确定要创建的文件夹的名称,我们使用国名属性。使用分割对所连接的字符串值的方法,我们在(例如,在“;;”)分离器/分隔符分割的特征,并设置在第一元件,记为listAttr.rpartition(';;')[0],随着值国名(犯罪类型,在实施例的工作区)。注意:无论您使用的第一个或最后一个元素串联的字符串是如何构成的,将取决于。确保您通过检查输出功能,使用正确的价值观。
同样,以确定父文件夹,我们使用家长属性。而不是使用的第一要素分割我们使用的最后一个元素[-1].此外,每个文件夹的功能必须有唯一的ID值,我们设置了串联第1和第2级的字符串值克米尔.
当我们需要一个文件夹的每个功能来创建,我们需要使用self.pyoutput(特性)确保空文件夹功能继续通过工作区。请记住,暴露了KML作家需要的属性,如kmlôu id,kmlôu name,和家长内PythonCaller.
第一级文件夹是相对简单,因为它只需要第一级属性的每个独特的价值。在该示例中,这是邻居值。同样,我们使用唯一值记录器找到独特的第一级文件夹的属性。使用类似的Python脚本如上,我们可以设置独特的属性值,无论是克米尔和国名.这是没有必要设置家长对于第一级文件夹。
添加KML作家为特征类型“文件夹”,然后连接的输出蟒蛇这个作家。那么这个功能型的作家会为你的功能自定义文件夹层次结构。
工作区中的第二个流,它使用数据的属性定义自定义文件夹层次结构。
您的功能(与几何形状)与相应的父文件夹关联起来,创建一个家长属性为您的功能和设置的值作为克米尔该文件夹的你希望你的功能定位中使用属性管理器.在该实例中的工作空间,这将是第二级别的文件夹的属性和第一级文件夹的属性值的串接字符串(@值(类型);@Value(邻域)在已完成的工作区)。添加另一个KML要素类型的作家和连接的输出属性管理器.
亚搏在线使用kml_parent属性将要素与相应父文件夹关联的工作流。
运行工作区,并打开谷歌地球内部产生的KML文件。自定义文件夹层次结构已经建立,你的特征与父文件夹关联,允许数据组织和易于观看的。
使用UniqueValueLogger自定义转换器和Python脚本,通过数据驱动进程创建自定义KML文件夹层次结构的Google Earth中的数据视图。
Python的相关变压器具有在FME工作台优良帮助可用权可在帮助> FME变压器,或者直接通过右击工作台画布内的变压器和选择帮助(在菜单的底部)进行访问。
你可以找到的Python FME的完整文档对象这里API:FME对象Python API
这里使用源自从公开数据中的数据由提供温哥华市, 不列颠哥伦比亚省。它包含了开放政府许可协议进行许可信息 - 温哥华。
©2019安全亚搏在线软件公司法律