斯潘8
斯潘4
考虑以下内容:
import fmeimport fmeobjectsimport mathclass featureprocessor(object):def_u init_uuu(self):pass def input(self,feature):maxangle=10 pts=feature.getAllcoordinates()跳过范围(1,len(pts)-1)中i的第一个和最后一个点:获取previo我们,当前和下一个点p0=pts[i-1]p1=pts[i]p2=pts[i+1]获取段角a1=self.get angle(p0,p1)a2=self.getangle(p1,p2)计算段角之间的偏差=min(abs(a2-a1),360 abs(a2-a1))超过t的点olerance if angle<maxangle:feat=fmeobjects.fmefeature(feature)p=fmeobjects.fmepoint(p1[0],p1[1])feat.setgeometry(p)feat.setattribute('deviation',angle)self.pyoutput(feat)def getangle(self,pt1,pt2):xdiff=pt2[0]-pt1[0]ydiff=pt2[1]-pt1[1]d=math.degrees(math.atan2(ydiff,xdiff))返回d def close(self):pass这应该在每个偏转大于maxangle的顶点处生成一个点。
我把溶液从JDH在这些点上创建分割线所需的效果。
请注意,当您有多行或其他聚合时,它可能表现得很奇怪。
import fmeimport fmeobjectsimport mathclass featureprocessor(object):def_u init_uuuu(self):pass def input(self,feature):maxangle=10 pts=feature.getAllcoordinates()prev_i=0跳过范围(1,len(pts)-1)中i的第一个和最后一个点:当前和下一点p0=pts[i-1]p1=pts[i]p2=pts[i+1]获取段角a1=self.get_角(p0,p1)a2=self.get_角(p1,p2)计算段角之间的偏差=min(abs(a2-a1),360 abs(a2-a1))如果角度超过最大值,如果角度>最大角度:self.output_line(功能,pts[prev_i:i+1])从第一个坐标到包括i prev_i=i如果不需要切割,则输出行的剩余部分,如果prev_i<len(pts)-1:self.output_line(feature,pts[上一行:len(pts)])def输出行(self,功能,点):feat=fmeobjects.fmefeature(feature)line=fmeobjects.fmeline(points)feat.setgeometry(line)self.pyoutput(feat)def get_angle(self,pt1,pt2):xdiff=pt2[0]-pt1[0]ydiff=pt2[1]-pt1[1]d=math.degrees(math.atan2(ydiff,xdiff))返回d def close(self):pass
我没有那么做,但我有基于偏转角的广义线。
虽然可以使用常规变压器来实现这一点,在Python中这样做要快几个数量级。
基本上你想要得到顶点的坐标,对于每个顶点,计算偏转角度。
如果大于最大值,然后输出该点。
将点和原始行发送到PointOnLineOverlayer
除起点和终点顶点外,任何顶点i的偏转角度都可以通过取分段角度差及其补数的绝对值的最小值来计算。
偏转角度=最小值(abs(a2-a1),360 abs(a2-a1))
在哪里?
a2=度(atan2(yI+ 1-Y我,XI+ 1-X我)
a1=度(atan2(y我-YI-1,X我-XI-1)
现在,我用python计算了到北向量的角度,然后我把它四舍五入到int所以我可以在合并行时按它分组。见https://knowledge.亚搏在线safe.com/questions/31810/azimuth-to-compass-directionbearing.html
这不是我想要的,也不适用于某些情况,在轴承上的差异很小,但舍入会产生差异。
有人知道根据属性范围组合线条的方法吗?
变压器:
python代码:
导入fmeimport fmeobjectsimport mathdef processfeature(feature):coords=feature.getAllcoordinates()如果len(coords)<2:返回x1,y1=坐标[0]x2,y2=coords[1]degbearing=math.degrees(math.atan2((x2-x1),(y2-y1)))feature.setattribute(“degbearing”,DEG轴承)
?2019安全亚搏在线软件公司|合法的