我改变了溶液@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
考虑以下:
导入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 =度我+ 1可能是我,X我+ 1- x我))
a1(量化(Y =度我可能是张,X我- x张))
现在,我已经用python计算了一个向北向量的角度,然后把它四舍五入为anint所以我可以根据它来组合直线。参见https://knowledge.sa亚搏在线fe.com/questions/31810/azimuth-to-compass-directionbearing.html
这不是我想要的,也不工作的情况下,轴承的差异是小的,但四舍五入造成了差异。
有人知道如何根据属性范围组合行吗?
变形金刚:
Python代码:
如果len(coords) < 2: return x1, y1 = coords[0] x2, y2 = coords[0] degBearing = math.degrees(math.atan2((x2 - x1),(y2 - y1)))setAttribute (“degBearing degBearing)