2015-10-15 69 views
0

我在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)]) 

Polygon and Polyline

+0

我可能无法帮忙,但如果您显示您的代码,它总是有帮助。 – RobertB

+0

@RobertB,刚刚添加了用于生成几何图形的代码 – AJG519

+0

Shapely无法外推行,因此您需要进行一些自定义工作才能获得此结果。 –

回答

2

在这个例子中,你可能只是做数学题,找到由段生成的线段(MultiLineString最后一个段和多边形边界段)之间的交集,而不会中继任何匀称的库计算。我不明白为什么你使用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() 

在这个解决方案中,我们推断该行的最后一段,并与多边形的边界线,以获得交叉点交叉处。 一些言论:

  1. 通知的EXTRAPOL_RATIO不变。根据多边形的复杂性或尺寸,它可以使线条与多边形边界在多个点上相交,或者根本不在点上。
  2. 您需要知道它是您想要扩展的行的最后一部分。

我认为这个问题有很多解决方案。取决于你想要的解决方案的普遍性,它可能变得非常复杂。我想你可以将代码调整到更一般的设置。