gpt4 book ai didi

python - Shapely 多边形与 Matplotlib 楔形的交集

转载 作者:行者123 更新时间:2023-12-01 07:27:07 28 4
gpt4 key购买 nike

在这个场景中,我正在绘制 matplotlib.patches.Wedge对象并缓冲shapely.geometry.LineString对象。我需要计算这两个对象的重叠区域。但是,Wedge 是一个 matplotlib.wedges 对象,不能与 Shapely 的 .intersection() 方法一起使用。

我该怎么做?这是一些代码:

from shapely.geometry import LineString
from matplotlib.patches import Wedge
from matplotlib import pyplot as plt
from descartes.patch import PolygonPatch

width = 5
radius = 1
rich = 1

circle_patch = Wedge((0, 0), radius+3,
0, 360, 3)

fig, ax = plt.subplots()

ax.add_patch(circle_patch)

ax.plot(0, 0, 'xr')
plt.autoscale()

coords = [
[0, 0],
[0, 1],
[0, 2],
[1, 2],
[2, 2]
]

stick = LineString(coords)

stick_patch = PolygonPatch(stick.buffer(0.5))

ax.add_patch(stick_patch)

x, y = stick.xy
ax.plot(x, y, 'r-', zorder=1)

plt.show()

area = stick.buffer(0.5).intersection(circle_patch).area

enter image description here

附注它必须是环形,而不是圆形

最佳答案

想通了。有一个._path.vertices matplotlib.patches的成员类,它为您提供楔形对象的坐标数组,然后您可以将其与 Shapely 的 LinearRing 一起使用。类来创建一个 Shapely 对象,如下所示:

from shapely.geometry import LineString, LinearRing
from matplotlib.patches import Wedge

width = 5
radius = 1
rich = 1

circle_patch = Wedge((0, 0), radius,
0, 360,)

ring_coords = circle_patch._path.vertices
ring_coords = ring_coords[(ring_coords[:, 0] != 0) & (ring_coords[:, 1] != 0)]

ring = LinearRing(ring_coords)
然而,它确实需要对坐标数组进行操作,我认为这不是最可靠的方法,但它对我来说是有用的。此外,环并不完全光滑,但我确信可以使用一些或其他 Numpy 对坐标数组进行一些平滑处理。或 Scipy功能。 ring

编辑:要创建单楔形线,必须删除 width楔子的成员。不过,稍后可以使用 Shapely 的 buffer() 重新合并它。功能。

关于python - Shapely 多边形与 Matplotlib 楔形的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390974/

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