如何使用Shapely从给定的两个点创建一条无限直线,以便与其他几何对象相交?

3

我可以使用以下功能获得连接两个点的线段:

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

这段代码创建了两个坐标点之间的线段。如何修改代码以获得一个无限长的直线穿过这些点?
我需要找到连接两个点的直线与由其4个角的坐标指定的四边形相交的点。
1个回答

4

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接