第8页
第4排
#python脚本示例(pythoncaller)从输入点过滤出尖峰顶点,并将剩余部分转换为没有尖峰的线。假设每个输入功能都有一个点几何,这些功能都有一个名为“group id”(正整数)的组id属性,最大尖峰角度为g。i通过一个名为“SpikeAngle”(正数)的用户参数,输入特征的顺序按组ID和连接顺序排序。确定一个点是否为Spike Vertex将仅通过角度进行。如果需要考虑Spike长度,修改并添加一些代码。#可以使用geometryfilter.import fme将输出特征分为点和线,FME对象,MathClassFeatureProcessor(对象):def uu init uuu(self):self.features,self.coords=[],[]存储输入特征及其坐标self.groupid=-1 self.spikangle=float(fme_macrovalues['spikangle'])def输入(self,功能):从输入功能中检索组ID和坐标。gid=int(feature.getattribute('groupid'))coord=feature.getcoordinate(0)如果功能是组中的第一个功能,为上一组创建和输出行,#清除特征和坐标列表,并更新当前组ID。如果gid!=self.groupid:self.outputline()self.features,self.coords=[],[]self.groupid=gid如果存储的功能数量大于1,#确定列表中的最后一个特征(点)是否为尖峰顶点。如果1<len(self.features):x0,y0=self.coords[-2][0],self.coords[-2][1]第二个最后一点x1,y1=self.coords[-1][0],self.coords[-1][1]最后一个点(尖峰顶点的候选点)x2,Y2=坐标[0],坐标[1]电流点(输入特征)ax,是=(x1-x0)(y1-y0)矢量:倒数第二个->倒数第二个BX,by=(x2-x1)(y2-y1)矢量:Last->Current计算两个矢量形成的绝对角度。#如果角度小于或等于规定的最大尖峰角,#输出最后一个特征(点:x1,y1),并将其从列表中删除。角度=180-abs(数学角度(数学角度2(ax*by-ay*bx,ax*bx+ay*by)))如果角度<=self.spikeAngle:self.pyoutput(self.features[-1])输出最后一个功能(spike vertex)self.features.pop()self.coords.pop()将输入功能及其坐标附加到列表中。self.features.append(feature)self.coords.append(coord)def outputline(self):创建线条几何图形并将其设置为组的第一个功能,#然后输出特征(没有尖峰的线)。如果1<len(self.features):self.features[0].setgeometry(fmeobjects.fmeline(self.coords))self.pyoutput(self.features[0])def close(self):为最终组创建并输出行。self.outputline()。
@高桥答案很好,但还有另一种方法。
首先将输入坐标连接成一个字符串(_坐标)。
然后在标记点之后,提取并连接其坐标。两个字符串应该相同,所以你需要做的就是通过一个列表搜索器来运行它们。请确保“将找到的列表元素降级”。
我怀疑对于更大的数据集,这种方法比Takashi的方法更有效,因为我希望listsearcher比空间过滤器更快,空间过滤器可能是资源密集型的(并且通常作为分组的拦截器)。我自己还没有在更大的数据集上测试它,所以可能是错误的。
?2019安全亚搏在线软件公司|法律