我试图找到圆形多边形和直线之间的交点,然后合并结果。
我希望所有的交点都属于该直线,也属于它们的并集,但这不是我所看到的。
这里有个例子:
from shapely.geometry import LineString, Point
line = LineString([(2, 5), (2.1, 1)]) # slightly oblique line
point1 = Point(2.5, 3)
int1 = line.intersection(point1.buffer(1))
int2 = line.intersection(point1.buffer(1.3))
union = int1.union(int2)
print union.length
print int2.length
结果:
4.22183534925
2.43702622444
因为int2包含int1,所以我希望它们的并集恰好是int2。 我希望联盟也只是一个LineString,而是由4行组成的MultiLineString。
如果我绘制联合线,我会看到它们实际上是如何彼此靠近但不在同一条线上。
我认为这与形状对象值的分辨率有关。
任何建议如何将“几乎平行”的线合并为一个? 还是您建议其他解决此问题的方法?
答案 0 :(得分:0)
据我所知,没有内置的内置函数可以执行所需的操作。 此外,您已经注意到,还有一些全面错误需要解决。 幸运的是,有一些匀称的功能可以帮助您实现一个简短的解决方案:
project
方法采用一个点,并为您提供从线的第一个点到该线的最接近点到给定点的距离。interpolate
方法,它为您提供LineString中的点,该点与该行的第一个点的距离为该距离。 我将假定您知道另一行在 内,如示例所示。 在这种情况下,您可以做的是将短点 排成更长的线,然后考虑它们的距离对这些点进行排序 到直线的第一点。
使用以下代码,
from shapely.geometry import LineString, Point
from shapely.ops import linemerge
def getProyection(aline, point_coords):
return aline.interpolate(aline.project(Point(point_coords)))
def mergeInside(aline, inside_line):
mline_tups = [(aline.project(Point(p)), p) for p in aline.coords]
mline_tups.extend([ (aline.project(Point(p)), getProyection(aline, p))
for p in inside_line.coords])
mline_tups.sort()
return LineString([p for _, p in mline_tups])
line = LineString([(2, 5), (2.1, 1)]) # slightly oblique line
point1 = Point(2.5, 3)
int1 = line.intersection(point1.buffer(1))
int2 = line.intersection(point1.buffer(1.3))
merged_line = mergeInside(int2, int1)
print(int1)
print(int2)
print(merged_line)
我得到:
LINESTRING (2.02796158358983 3.881536656406788, 2.072567874421353 2.097285023145893)
LINESTRING (2.019819096605441 4.207236135782384, 2.080725721869193 1.770971125232286)
LINESTRING (2.019819096605441 4.207236135782384, 2.027961583589831 3.881536656406788, 2.072567874421353 2.097285023145893, 2.080725721869193 1.770971125232286)
答案 1 :(得分:0)
由于我主要对联合的长度感兴趣,因此对联合的确切顶点感兴趣,因此我找到了另一种测量联合的方法。
from shapely.geometry import LineString, Point
line = LineString([(2, 5), (2.1, 1)]) # slightly oblique line
point1 = Point(2.5, 3)
int1 = line.intersection(point1.buffer(1))
int2 = line.intersection(point1.buffer(1.3))
line_not_intersected = line.difference(point1.buffer(1))
line_not_intersected = line_not_intersected.difference(point1.buffer(1.3))
print line.length - line_not_intersected.length
print int2.length
它给出了预期的结果:
2.43702622444
2.43702622444
有趣的是,同时让我烦恼
union = line.difference(line_not_intersected)
union是一个LineString,但其长度与两行长度的差不同。
print line.length - line_not_intersected.length
print union.length
2.43702622444
4.00124980475