我可以使用以下功能获得连接两个点的线段:
line = shapely.geomtery.LineString([[0,0],[0,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)])
这是一个需要拆分/获取交点的线段和多边形的示例:
接下来,我们可以从边界框的坐标和给定线段端点的坐标计算一个新的扩展线段的坐标。以下是代码,应该很容易理解: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])
我们可以看到,新创建的线现在穿过了原始多边形:
从这里开始,获取交集很容易:intersection = extended_line.intersection(polygon)
from shapely.ops import split
parts = split(polygon, extended_line)