gpt4 book ai didi

python - 如何从两个给定点创建一条无限线以与 Shapely 中的其他几何对象相交?

转载 作者:行者123 更新时间:2023-12-05 02:53:03 30 4
gpt4 key购买 nike

我可以使用以下函数获得连接两点的线段:

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

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

我需要找到连接 2 点的线与由其 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)

关于python - 如何从两个给定点创建一条无限线以与 Shapely 中的其他几何对象相交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62388276/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com