我在Shapely中有一个Polygon和一个MultiLineString。我想扩展未到达多边形边界的LineString段,以便它确实到达多边形边界。如果它延伸过去也没关系,因为之后我可以很容易地将它剪辑到边界。
理想情况下,它会以相同的角度继续,但我认为这比将其直接延伸到边界要困难得多。
有没有人对如何做到这一点有任何建议?
我使用以下代码生成了几何图形(作为我实际需要做的简化示例):
import shapely
from shapely.geometry import *
Line=MultiLineString([((3,0),(3,5)),((3,5),(7,9.5))])
Box=Polygon([(0,0),(0,10),(10,10),(10,0)])
答案 0 :(得分:2)
在该示例中,您可以进行数学运算并找到由段生成的线之间的交集(MultiLineString最后一段和多边形边界的段),而不会转发任何形状库计算。
(当你应该使用一个简单的LineString时,我不明白你为什么要使用MultiLineString,因为所有的线段都是连续的。)
更一般的解决方案如下:
from shapely.geometry import *
def getExtrapoledLine(p1,p2):
'Creates a line extrapoled in p1->p2 direction'
EXTRAPOL_RATIO = 10
a = p1
b = (p1[0]+EXTRAPOL_RATIO*(p2[0]-p1[0]), p1[1]+EXTRAPOL_RATIO*(p2[1]-p1[1]) )
return LineString([a,b])
line=LineString([(3,0),(3,5),(7,9.5)])
box=Polygon([(0,0),(0,10),(10,10),(10,0)])
box_ext = LinearRing(box.exterior.coords) #we only care about the boundary intersection
l_coords = list(line.coords)
long_line = getExtrapoledLine(*l_coords[-2:]) #we use the last two points
if box_ext.intersects(long_line):
intersection_points = box_ext.intersection(long_line)
new_point_coords = list(intersection_points.coords)[0] #
else:
raise Exception("Something went really wrong")
l_coords.append(new_point_coords)
new_extended_line = LineString(l_coords)
# To see the problem:
import pylab
x, y = box.exterior.xy
pylab.plot(x,y)
l_coords = list(line.coords)
x = [p[0] for p in l_coords]
y = [p[1] for p in l_coords]
pylab.plot(x,y)
longl_coords = list(long_line.coords)
x = [p[0] for p in longl_coords]
y = [p[1] for p in longl_coords]
pylab.plot(x,y)
pylab.plot(new_point_coords[0], new_point_coords[1], 'o')
pylab.show()
# To see the solution:
x, y = box.exterior.xy
pylab.plot(x,y)
l_coords = list(new_extended_line.coords)
x = [p[0] for p in l_coords]
y = [p[1] for p in l_coords]
pylab.plot(x,y)
pylab.show()
在此解决方案中,我们推断线的最后一段并将其与多边形的边界线相交以获得交点。 一些评论:
我认为这个问题有很多解决办法。根据您想要的解决方案的一般程度,它可能变得非常复杂。我想你可以将代码调整为更一般的设置。