将小多边形堆叠在另一个更大的多边形中
Stacking small polygons inside another bigger one
我有以下形状的像素多边形
big_poly = Polygon([(94.5, 77.0),
(92.5, 53.0),
(87.5, 45.0),
(66.0, 20.5),
(9.0, 3.5),
(5.5, 6.0),
(4.5, 13.0),
(7.5, 26.0),
(6.5, 91.0),
(8.0, 92.5),
(16.0, 92.5),
(44.0, 86.5)])
我需要用 4 x 6 的像素多边形填充 big_poly
,让它们都落在大的边界内并与其最小轴平行(相同的旋转)。
解决方案 肯定对@Georgy 很有帮助。
所以我能够做到以下几点:
使用以下代码:
b = building_poly.boundary
points = []
for x in range(int(np.floor(xmin)), int(np.ceil(xmax)), 4):
for y in range(int(np.floor(ymin)), int(np.ceil(ymax)), 6):
points.append((x, y))
points = MultiPoint(points)
result = points.intersection(building_poly)
并绘制 result
中的点,但现在我需要从这些点创建多边形。
如何将这些点变成矩形多边形?
我也找到了 ,但不确定如何让它适合我的情况。
这是我们可以做的:
- 根据给定多边形的边界构造两个 X 和 Y 坐标数组
- 通过遍历连续的 X 和 Y 坐标对构建完全覆盖给定多边形的矩形网格
- 过滤掉那些没有完全位于多边形内部的矩形
这很可能不是最有效的解决方案,但它对您的情况表现良好:
dx = 4
dy = 6
xmin, ymin, xmax, ymax = big_poly.bounds
xs = np.arange(np.floor(xmin), np.ceil(xmax) + 1, dx)
ys = np.arange(np.floor(ymin), np.ceil(ymax) + 1, dy)
rectangles = (Polygon([(x_start, y_start), (x_end, y_start),
(x_end, y_end), (x_start, y_end)])
for x_start, x_end in zip(xs, xs[1:])
for y_start, y_end in zip(ys, ys[1:]))
rectangles = [rectangle for rectangle in rectangles
if big_poly.contains(rectangle)]
我有以下形状的像素多边形
big_poly = Polygon([(94.5, 77.0),
(92.5, 53.0),
(87.5, 45.0),
(66.0, 20.5),
(9.0, 3.5),
(5.5, 6.0),
(4.5, 13.0),
(7.5, 26.0),
(6.5, 91.0),
(8.0, 92.5),
(16.0, 92.5),
(44.0, 86.5)])
我需要用 4 x 6 的像素多边形填充 big_poly
,让它们都落在大的边界内并与其最小轴平行(相同的旋转)。
解决方案
使用以下代码:
b = building_poly.boundary
points = []
for x in range(int(np.floor(xmin)), int(np.ceil(xmax)), 4):
for y in range(int(np.floor(ymin)), int(np.ceil(ymax)), 6):
points.append((x, y))
points = MultiPoint(points)
result = points.intersection(building_poly)
并绘制 result
中的点,但现在我需要从这些点创建多边形。
如何将这些点变成矩形多边形?
我也找到了
这是我们可以做的:
- 根据给定多边形的边界构造两个 X 和 Y 坐标数组
- 通过遍历连续的 X 和 Y 坐标对构建完全覆盖给定多边形的矩形网格
- 过滤掉那些没有完全位于多边形内部的矩形
这很可能不是最有效的解决方案,但它对您的情况表现良好:
dx = 4
dy = 6
xmin, ymin, xmax, ymax = big_poly.bounds
xs = np.arange(np.floor(xmin), np.ceil(xmax) + 1, dx)
ys = np.arange(np.floor(ymin), np.ceil(ymax) + 1, dy)
rectangles = (Polygon([(x_start, y_start), (x_end, y_start),
(x_end, y_end), (x_start, y_end)])
for x_start, x_end in zip(xs, xs[1:])
for y_start, y_end in zip(ys, ys[1:]))
rectangles = [rectangle for rectangle in rectangles
if big_poly.contains(rectangle)]