我改变了溶液@jdh以创建在这些点处分割线的期望效果。
注意,当您有多行或其他聚合时,它的行为可能很奇怪。
导入fme导入fmeobjects导入math class FeatureProcessor(object): def _init__(self):传递def input(self,feature): maxAngle = 10 pts= feature.getAllCoordinates()#get previous, current and next point p0 = pts[i-1] p1 = pts[i] p2 = pts[i+1] # get segment angles a1 = self.get_angle(p0,p1) a2 = self.get_angle(p1,p2) # calculate deflection between segments angle = min(abs(a2-a1),360-abs(a2-a1)) #If angle exceeds maximum, output line so far if angle > maxAngle: self.output_line(feature, pts[prev_i:i+1]) # Make line from 1st coordinate up to and including i prev_i = i # Output remainder of line if a cut wasn't required if prev_i < len(pts)-1: self.output_line(feature, pts[prev_i:len(pts)]) def output_line(self, feature, points): 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)) return d def close(self): pass
挠度= @min(@Value(_angle_between_segments), 360 - @Value(_angle_between_segments))
考虑以下:
导入fme导入fmeobjects导入math class FeatureProcessor(object): def init__(self):传递def input(self,feature): maxAngle = 10 pts= feature.getAllCoordinates() #跳过范围i的第一个和最后一个点(1,len(pts)-1):#get previous, current and next point p0 = pts[i-1] p1 = pts[i] p2 = pts[i+1] # get segment angles a1 = self.GetAngle(p0,p1) a2 = self.GetAngle(p1,p2) # calculate deflection between segments angle = min(abs(a2-a1),360-abs(a2-a1)) #points that exceed tolerance if angle < maxAngle: feat = fmeobjects.FMEFeature(feature) p = fmeobjects.FMEPoint(p1[0],p1[1]) feat.setGeometry(p) feat.setAttribute('DEFLECTION',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)) return d def close(self): pass这将在每个顶点上产生一个点,其中挠度大于MaxAngle。
我没有这样做,但是我已经根据偏转角把直线一般化了。
虽然可以使用常规的转换器来实现这一点,但是在python中这样做要快几个数量级。
本质上你会想要得到顶点的坐标,对于每个顶点计算偏角。
如果大于最大值,则输出该点。
将点和原始线发送到pointOnLineOverlayer
除了起点和终点外,任何顶点i的偏转角都可以通过取段角之差及其补角的绝对值的最小值来计算
DeflectionAngle = min (abs (a2-a1), 360 - abs (a2-a1))
在哪里
a2(量化(Y =度I + 1可能是一世,XI + 1- x一世))
a1(量化(Y =度一世可能是I-1,X一世- xI-1))
现在,我已经用python计算了一个向北向量的角度,然后把它四舍五入为anINT所以我可以根据它来组合直线。参见https://knowledge.sa亚搏在线fe.com/questions/31810/azimuth-to-compass-directionbearing.html
这不是我想要的东西,并为某些情况下不能正常工作,其中在轴承上的差异很小,但是舍入产生的差异。
有谁知道一种方法来基于属性范围线结合?
变形金刚:
Python代码:
进口FME进口fmeobjects导入数学DEF processFeature(功能):座标= feature.getAllCoordinates()如果LEN(coords)使用<2:返回X1,Y1 = COORDS [0] X2,Y2 = COORDS [1] degBearing = math.degrees(math.atan2((X2 - X1),(Y2 - Y1)))feature.setAttribute( “degBearing”,degBearing)