作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以使用以下函数获得连接两点的线段:
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)])
这是我们想要分割/获得交集的线和多边形的示例:
接下来,根据边界框的坐标和给定线的端点坐标,我们可以计算出新延伸线的坐标。此代码应该是不言自明的:
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)
关于python - 如何从两个给定点创建一条无限线以与 Shapely 中的其他几何对象相交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62388276/
我是一名优秀的程序员,十分优秀!