如何用数组表示复杂多边形?基于城市DEM多边形的数组构建需求
解决方案
1. 生成城市形状的掩码数组
利用matplotlib.path.Path可以快速判断网格点是否在多边形边界内,生成对应掩码:
首先导入依赖库:
import numpy as np from matplotlib.path import Path
假设你已经有城市边界的多边形坐标列表city_boundary(格式为[(x1,y1), (x2,y2), ..., (xn,yn)]),以及原方形数组的尺寸参数I、J(对应原np.zeros(I+1, J+1)的维度):
# 生成覆盖整个方形区域的网格坐标点 x_grid, y_grid = np.meshgrid(np.arange(I+1), np.arange(J+1)) # 将网格点转换为N×2的坐标数组(每个元素是(x,y)) points = np.vstack([x_grid.ravel(), y_grid.ravel()]).T # 创建多边形路径对象 city_path = Path(city_boundary) # 判断每个网格点是否在城市边界内,生成布尔掩码后转为int类型(1表示内部,0表示外部) mask = city_path.contains_points(points).reshape(J+1, I+1).astype(int)
2. 修改循环代码,仅在掩码为1的区域执行计算
直接在原有循环中加入掩码判断即可:
for j in range(1, J+1): for i in range(1, I): if mask[j, i] == 1: # 执行内部节点方程等计算逻辑 # internal node equation etc etc#
3. 可选:用向量化操作替代循环(提升效率)
如果你的计算逻辑支持向量化,可以直接跳过循环,对掩码为1的区域批量计算,效率更高:
# 示例:初始化结果数组 result = np.zeros_like(mask) # 仅在城市内部区域执行计算 result[mask == 1] = 你的计算表达式 # 例如基于x_grid[mask==1]、y_grid[mask==1]的运算
注意:确保
city_boundary的坐标顺序是闭合多边形(首尾坐标建议一致),且网格坐标的x/y顺序和边界坐标的x/y对应一致,避免出现错位。
内容的提问来源于stack exchange,提问作者DJalil
相关产品推荐
相关产品推荐

