关于“分角分线”的评论和答案 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
高桥评论了高桥的回答 https://knowledge.亚搏在线safe.com/comments/76301/view.html 或者,也可以使用来自FME Hub的PolylineAnalyzer来计算每个顶点的转角,因为转换器会通过顶点端口向它们输出包含“_angle_between_segments”(0-360度)属性的顶点。
挠度= @min(@Value(_angle_between_segments), 360 - @Value(_angle_between_segments))
格林尼治时间8月14日星期二
答案由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 =度I + 1可能是一世,XI + 1- x一世))

a1(量化(Y =度一世可能是I-1,X一世- xI-1))

格林尼治时间8月13日星期一15:28 - 29 jdh
ebygomm对ebygomm的回答的评论 https://knowledge.亚搏在线safe.com/comments/76265/view.html 这里提到的方法可能是一种可能性

https://knowledge.亚搏在线safe.com/questions/47675/group-records-based-on-attribute-values.html

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

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