shapely: python 中的图形处理功能包
buffer - 缓冲区,shrink / erode - 缩小,expand / dilate - 膨胀
文章目录
Python 代码
运行前需确保引入的相关功能包都已安装:pip install shapely
(包含 numpy),pip install matplotlib
。
import numpy as np
from shapely.geometry import LinearRing, Polygon
import matplotlib.pyplot as plt
distance = 0.2
cap_style = 2 # 1 (round), 2 (flat), 3 (square)
join_style = 2 # 1 (round), 2 (mitre), and 3 (bevel)
mitre_limit = 5 # 默认是 5
polygon_np = np.array([
[0, 0],
[0.5, 0],
[0.5, 0.5],
[1, 0.5],
[1, 1],
[0, 1],
]) # 这里没有闭环,可以直接输入 shapely 的 LinearRing
polygon_shapely = Polygon(LinearRing(polygon_np))
# buffer 后得到的是闭环的结果,即第一个点和最后一个点相同
polygon_dilated_np = np.array(polygon_shapely.buffer(
distance, cap_style=cap_style, join_style=join_style, mitre_limit=mitre_limit).exterior.coords)
polygon_shrunk_np = np.array(polygon_shapely.buffer(
-distance, cap_style=cap_style, join_style=join_style, mitre_limit=mitre_limit).exterior.coords)
# 以下用于绘图
fig, ax = plt.subplots(figsize=(8, 6), dpi=80)
ax.plot(
np.append(polygon_np[:,0], polygon_np[0,0]),
np.append(polygon_np[:,1], polygon_np[0,1]),
'.-', color='b', label='original', lw=3, ms=8, mew=3)
ax.plot(
polygon_dilated_np[:,0],
polygon_dilated_np[:,1],
'.-', color='orange', label=' buffer (dilated)', lw=3, ms=8, mew=3)
ax.plot(
polygon_shrunk_np[:,0],
polygon_shrunk_np[:,1],
'.-', color='r', label='buffer (shrunk)', lw=3, ms=8, mew=3)
ax.axis('equal')
ax.legend(loc='lower right', fontsize=14)
plt.tight_layout()
plt.show()
join_style 参数的影响
以下图中,蓝色为原始图形,红色为缩小后的图形,橙色为膨胀后的图形,都是由点的序列组成的。
join_style = 1丨round,圆角
join_style = 2丨mitre,单顶点
修改 mitre_limit 参数,一旦 buffer 前后顶点的距离超过 mitre_limit * distance,单顶点就会被截为倒角(bevel)。截为倒角后,倒角斜边到原始顶点的距离等于 mitre_limit * distance。
mitre_limit = 5
mitre_limit 也可以设置为
2
\sqrt{2}
2,同样不会产生倒角,因为对于直角多边形来说,缩小 / 膨胀后顶点到原顶点的距离即
2
\sqrt{2}
2 * distance。
mitre_limit = 1
此时单顶点被截为了倒角,倒角斜边到原始顶点的距离等于 mitre_limit * distance 即 distance。
join_style = 3丨bevel,倒角
直角处完全的倒角,倒角斜边到原始顶点的距离等于
1
/
2
1/\sqrt{2}
1/2 * distance。
cap_style 参数的影响
对于平面多边形这样的封闭图形,cap_style 参数没有影响,该参数用于指定非封闭图形线段末端缩小 / 膨胀后的形态,具体可以参考以下官方文档【链接】【链接】。