span8号
斯潘4
有人能帮我理解如何使用python调用程序吗?我看过教程,旧的代码,甚至有助于解决我得到的错误-python异常
我是 无法解决此问题。我需要将形状文件中的坐标与点云文件中的坐标匹配,并提取点云分类数据。我的逻辑有许多未解决的问题,但我的重要问题如下
如何在FME中导入和操作python调用程序中的属性值?
在我的空间,我有一个12点的形状文件。我正在提取它的坐标,并将其作为字符串存储在_file_contents变量中[格式为(x,y),(x,y),]我需要对此进行大量的操作,但要了解我是否正确使用变压器,我正在执行第一个基本函数,从字符串中删除最后一个逗号。然而,我不断地得到我在上面发布的错误。
我已经附上了我的模板文件-点匹配
下面是您发布的python代码:
类功能处理器(对象):def u init uuu(self):self.bgt _point=none def input(self,feature):self.bgt _point=feature.getattribute(“u coordinates”)self.bgt _point=feature.setattribute(“u coordinates”,_坐标[:-1])def close(self):self.pyoutput(self.bgt_point)
问题是在第6行中有一个对特性属性“_coordinates”的引用,就好像它是一个python对象一样,但是在任何地方的python上下文中都没有定义“_coordinates”,这就解释了这个例外。简而言之:python对象(变量)和特性属性不会自动混合,您必须使用诸如setattribute()和getattribute()。
其次,最后一行也是有问题的:
self.pyoutput(self.bgt_point)
从句法上讲这不是错的,但是pyoutput()方法需要一个fmefeature类型的对象,但在您的例子中,self.bgt_点总是未定义的,因为setattribute()没有返回值(上面第6行)。
以下是您可以重写它的方法:
类FeatureProcessor(object):def u init_uuuu(self):self.bgt_point=''初始化为空字符串def输入(self,feature):将坐标属性附加到self.bgt_point self.bgt_point+=feature.getattribute(“u coordinates”)def close(self):创建新功能新功能新功能=fmefeature()。#将self.bgt_point减去最后一个字符分配给feature attribute_coordinates new_feature.setattribute(“_coordinates”,self.bgt_point[:-1])self.pyoutput(新的_功能)
下面是在转换结束时退出PythonCaller的单个特性的输出:
_coordinates(编码:utf-8): (98545.662,437724.223),(98536.242,437554.716),(98758.669,437714.289),(98539.194,437634.46),(98540.577,437682.626),(98638.13,437563.122),(98564.843,437818.05),(98750.72,437726.321),(98750.23,437727.173)
希望有道理,如果不告诉我。
我意识到我确实想从Python程序返回一个元组。我能成功地做到。
部件=第1项的坐标(bgt_pt,las_pt)组件中的项2:newFeature=fmeObjects.fmeFeature()newFeature.setAttribute('cid',item1)newfeature.setattribute('class',项2)self.pyoutput(新功能)
所以,我的输出如下
到现在为止,一直都还不错。
现在,我在这里获得的值必须在工作流中进一步使用。亚搏在线所以,如果将其存储为列表,即List.CID and List.Class where I could access the values as
列表.cid 0=21697
列表.cid 1=22420
列表.类别0=6
列表.类别1=6
等等。
然而,无论我如何设置我的属性,即已存在的名单等,它似乎不起作用。请你帮忙!
newfeature=fmeobjects.fmefeature()components=coordinatematch(bgt_pt,las_pt)for i,(项目1)项2)在枚举(组件)中:newfeature.setattribute('list%d.cid'%i,item1)newfeature.setattribute('list%d.class'%i,项2)self.pyoutput(新功能)
您好!@大卫·R,
我又困住了。我完成了我想要实现的代码脚本,这就是我的新代码的样子
从fmeobjects导入fmefeatureimport numpyclass featureprocessor(object):def u init_uuu(self):self.cid=0 def input(self,feature):bgt_pt=feature.getattribute('bgt_points')las_pt=feature.getattribute('las_points')Distance_list=[]def coordinatematch(bgt_pt,las_pt):f或b1,b2枚举(bgt_pt):对于l1,l2 in enumerate(las_pt): bp1 = bgt_pt[b1][0] bp2 = bgt_pt[b1][1] lp1 = las_pt[l1][0] lp2 = las_pt[l1][1] d = numpy.sqrt((bp1 - lp1)*(bp1 - lp1) + (bp2 - lp2)*(bp2 - lp2)) distance_list.append((las_pt[l1][2],d)分量=min(距离_列表,key=lambda t:t[1])返回组件bgt_pt=bgt_pt.split(',')las_pt=las_pt.split(',')las_pt=las_pt[:-1]bgt_pt=[在bgt_pt中的i的float(i)las_pt=[在las_pt中的i的float(i)=[在zip中的i的i([iter(las_pt)]*3]bgt_pt=[在zip中的i的i([iter(bgt_pt)]*2)]self.cid=coordinatematch(bgt_pt,las_pt)def close(self):new_feature=fmefeature()new_feature.setattribute(“cid”,self.cid)self.pyoutput(新特性)
我已经创建了一个名为CID的属性,并在我的工作流中将其分配为NULL。亚搏在线我想要我的python脚本的输出,即存储在要存储在cid中的组件中的值。
你能帮我解决问题吗?根据你上一篇文章,我有一个要发送出去的特性,我将它设置为component的值。我仍然得到以下错误:(
python异常:无法将属性值转换为支持的属性类型。回溯(最近调用的最后一个):文件“ “,第41行,在close type error:无法将属性值转换为支持的属性类型。f_27(pythonFactory):pythonFactory未能关闭properlyf_27(pythonFactory):发生了致命错误。查看上面的日志文件了解详细信息
?2019安全亚搏在线软件公司|法律