“按角度劈线”答案 https://knowledge.亚搏在线safe.com/questions/76254/splitting-line-by-angle.html “按角度劈线”最新答案 答案由mannershark https://knowledge.亚搏在线safe.com/answers/76345/view.html

我改变了溶液@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
格林威治时间8月14日星期二09:56:04 mannershark
答案由jdh https://knowledge.亚搏在线safe.com/answers/76272/view.html

考虑以下:

导入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。
改进的建议是将MaxAngle从特性的属性中取出。
当使用pointOnLineOverlayer时,如果您的线可能重叠(不在节点处),您可能希望使用group by。


格林尼治时间2018年8月13日星期一16:32:22 jdh
答案由jdh https://knowledge.亚搏在线safe.com/answers/76267/view.html

我没有这样做,但是我已经根据偏转角把直线一般化了。
虽然可以使用常规的转换器来实现这一点,但是在python中这样做要快几个数量级。
本质上你会想要得到顶点的坐标,对于每个顶点计算偏角。

如果大于最大值,则输出该点。
将点和原始线发送到pointOnLineOverlayer

除了起点和终点外,任何顶点i的偏转角都可以通过取段角之差及其补角的绝对值的最小值来计算

DeflectionAngle = min (abs (a2-a1), 360 - abs (a2-a1))

在哪里

a2(量化(Y =度我+ 1可能是,X我+ 1- x))

a1(量化(Y =度可能是,X- x))

格林尼治时间8月13日星期一15:28 - 29 jdh
答案由mannershark https://knowledge.亚搏在线safe.com/answers/76264/view.html

现在,我已经用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)
格林尼治时间2018年8月13日星期一15:03:11 mannershark