【ArcGIS Pro】将shp文件转换为栅格raster数据教程:Python处理代码详解
目录
要将带有取值的 Shapefile (SHP) 多边形数据 转换为 栅格 (Raster) 数据,可以使用 ArcGIS Pro 或 QGIS 等 GIS 软件。
准备工作:带取值的shp文件
shp文件如下:
查看shp文件坐标系
在 “Contents” 面板 右键你的 SHP 文件 → Properties → Source,查看 坐标系 (Coordinate System):

Hong_Kong_1980_Transverse_Mercator,单位是 米 (Meters)。
Hong Kong 1980,单位是 度 (Degrees)。
确保 Value Field(值字段) 类型正确
可能的问题:Total_AH 可能是 字符串 (Text) 类型,而非 数值 (Integer/Float) 类型,这会导致栅格值异常。
方法 1:使用 ArcGIS Pro 的 “Polygon to Raster” 工具
下面是 ArcGIS Pro 的详细操作步骤:
步骤 1:打开 ArcGIS Pro
确保你的 SHP 文件 已经加载到 ArcGIS Pro 中。
步骤 2:打开 “Polygon to Raster” 工具
在 “Geoprocessing”(地理处理工具) 中搜索 “Polygon to Raster”。
选择你的 Shapefile (SHP) 文件 作为输入。
步骤 3:设置转换参数
说明:Cellsize = 500 的单位取决于 SHP 文件的坐标系:
如果是 地理坐标系(WGS 84,经纬度,单位是度):500 可能表示 500 度,这会导致错误,建议使用 更小的值(如 0.0001 度)。
如果是 投影坐标系(UTM、Web Mercator 等,单位是米):500 代表 500 米,这个值通常是合理的。

步骤 4:运行工具
点击 “Run”(运行),ArcGIS Pro 将把 Polygon 数据 转换成 栅格数据。
报错1:输出结果为3.40282e+38(无效值)
栅格值范围异常:3.40282e+38 和 -3.40282e+38,这通常表示无效值(NoData)或数据类型问题。
方法2:Python代码
Python完整代码如下:
import geopandas as gpd
import rasterio
import numpy as np
from rasterio.transform import from_origin
from rasterio.features import rasterize
# **1. 读取 Shapefile**
shp_path = r"D:\0 DataBase\0 Hong Kong Database\Building AHE in Hong Kong\Building_July15_AH_hour0.shp"
gdf = gpd.read_file(shp_path)
# **2. 确保数据是投影坐标系**
if gdf.crs is None or not gdf.crs.is_projected:
raise ValueError("❌ 输入 SHP 必须为投影坐标系(单位:米)。请先转换坐标系!")
# **3. 获取 SHP 边界**
minx, miny, maxx, maxy = gdf.total_bounds # 获取数据的最小边界
cell_size = 50 # 50m 栅格大小
# **4. 计算栅格行列数**
cols = int((maxx - minx) / cell_size) + 1
rows = int((maxy - miny) / cell_size) + 1
# **5. 生成栅格的仿射变换**
transform = from_origin(minx, maxy, cell_size, cell_size)
# **6. 选择用于栅格化的数值字段**
value_field = "Total_AH" # 统计的字段
if value_field not in gdf.columns:
raise ValueError(f"❌ 字段 {value_field} 不存在,请检查 SHP 文件的字段名称!")
# **找到最大 & 最小 AHE 的多边形**
max_ahe_poly = gdf.loc[gdf[value_field].idxmax()]
min_ahe_poly = gdf.loc[gdf[value_field].idxmin()]
# **打印结果**
print(f"✅ 最大 AHE: {max_ahe_poly[value_field]}")
print(f"✅ 最小 AHE: {min_ahe_poly[value_field]}")
print(f"最大 AHE 多边形:\n{max_ahe_poly}")
print(f"最小 AHE 多边形:\n{min_ahe_poly}")
# **7. 处理 NaN 值(用 0 替代)**
gdf[value_field] = gdf[value_field].fillna(0)
# **8. 生成栅格化数据**
shapes = ((geom, value) for geom, value in zip(gdf.geometry, gdf[value_field])) # 多边形 + 值
raster_data = rasterize(
shapes=shapes,
out_shape=(rows, cols),
transform=transform,
fill=0, # 默认值填充 0
all_touched=True, # 让每个像元包含的多边形都参与计算
dtype=np.float32
)
# **9. 保存为 TIFF**
tif_path = r"D:\0 DataBase\0 Hong Kong Database\Building AHE in Hong Kong\AHE in tif\AHE_July15_00.tif"
with rasterio.open(
tif_path, "w",
driver="GTiff",
height=rows,
width=cols,
count=1,
dtype=raster_data.dtype,
crs=gdf.crs.to_wkt(),
transform=transform,
nodata=0
) as dst:
dst.write(raster_data, 1)
print(f"✅ 成功生成 {cell_size}m 栅格数据: {tif_path}")
all_touched=True/False
ArcGIS 结果图:
默认 (all_touched=False):
根据结果图,可知结果并不合理。all_touched=False 导致部分建筑没有被正确映射到 50m 栅格。
all_touched=True:
一个多边形(建筑)的 AHE 值可能会被多个像元共享,但不会重复计算:
参考
作者:WW、forever