如何在Shapely中从两个给定的点创建一条无限线,以获得与其他几何对象的交点?

问题描述 投票:0回答:1

我能够使用下面的函数获得连接两点的线段。

line = shapely.geomtery.LineString([[0,0],[0,1]]) 

这段代码在两个坐标之间创建了一条线段,我如何修改这段代码来获得一条无限长的线段来通过这些点?

我需要找到连接2点的线段和由4个角的坐标指定的四边形之间的交点。

python shapely
1个回答
1
投票

Shapely不支持无限的线段,但你可以通过将给定的线段扩展到覆盖其他几何体的边界框上来进行近似。

from shapely.geometry import box, LineString, Point, Polygon

# polygon or any other geometry object/collections of objects
polygon = Polygon([(-100, -100), (60, -60), (100, 100), (-60, 60)])
# your original line (could be located anywhere - inside/outside/crossing the polygon)
line = LineString([(-130, -130), (-116, -110)])

这里有个例子,是一条线和一个多边形,我们想用它来分割交点。

enter image description here

接下来,根据边界框的坐标 和给定直线的端点坐标 我们可以计算出一条新的扩展线的坐标。这个代码应该是不言自明的。

minx, miny, maxx, maxy = polygon.bounds
bounding_box = box(minx, miny, maxx, maxy)
a, b = line.boundary
if a.x == b.x:  # vertical line
    extended_line = LineString([(a.x, miny), (a.x, maxy)])
elif a.y == b.y:  # horizonthal line
    extended_line = LineString([(minx, a.y), (maxx, a.y)])
else:
    # linear equation: y = k*x + m
    k = (b.y - a.y) / (b.x - a.x)
    m = a.y - k * a.x
    y0 = k * minx + m
    y1 = k * maxx + m
    x0 = (miny - m) / k
    x1 = (maxy - m) / k
    points_on_boundary_lines = [Point(minx, y0), Point(maxx, y1), 
                                Point(x0, miny), Point(x1, maxy)]
    points_sorted_by_distance = sorted(points_on_boundary_lines, key=bounding_box.distance)
    extended_line = LineString(points_sorted_by_distance[:2])

我们可以看到新创建的线与原来的多边形相交。

enter image description here

从这里开始,得到交叉点就很简单了。

intersection = extended_line.intersection(polygon)

或者如果你想分割,

from shapely.ops import split
parts = split(polygon, extended_line)
© www.soinside.com 2019 - 2024. All rights reserved.