【ArcGIS Pro】shp文件转换为栅格raster数据(含Python处理代码)

要将带有取值的 Shapefile (SHP) 多边形数据 转换为 栅格 (Raster) 数据,可以使用 ArcGIS Pro 或 QGIS 等 GIS 软件。

准备工作:带取值的shp文件

shp文件如下:
在这里插入图片描述

查看shp文件坐标系

在 “Contents” 面板 右键你的 SHP 文件 → Properties → Source,查看 坐标系 (Coordinate System):

  • 如果是 WGS 84(单位是度),建议改成 0.0001。
  • 如果是 UTM 或 Web Mercator(单位是米),500 代表 500 米,是合理的。
    在这里插入图片描述
  • 投影坐标系:Hong Kong 1980 Grid
    Hong_Kong_1980_Transverse_Mercator,单位是 米 (Meters)。
  • 地理坐标系:Hong Kong 1980
    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:设置转换参数

  • Input Features(输入要素): 选择你的 SHP 文件。
  • Value Field(值字段): 选择你想要网格化的字段,比如 height(高度)。
  • Output Raster Dataset(输出栅格数据集): 选择输出的 栅格文件路径。
  • Cell Size(像元大小): 设定栅格的分辨率,例如 10m、30m 或 100m(根据需要选择)。
    说明:Cellsize = 500 的单位取决于 SHP 文件的坐标系:
    如果是 地理坐标系(WGS 84,经纬度,单位是度):500 可能表示 500 度,这会导致错误,建议使用 更小的值(如 0.0001 度)。
    如果是 投影坐标系(UTM、Web Mercator 等,单位是米):500 代表 500 米,这个值通常是合理的。
  • Cell Assignment Type:Cell Center表明只有 像元中心落在某个多边形内,才会被赋值,可能导致部分区域 NoData 或数据不完整。
  • Processing Extent(处理范围): 选择 “Same as Layer”(与输入图层相同),保证范围一致。
    在这里插入图片描述

步骤 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 结果图:

  • 绿色 多边形是原始建筑(Shapefile)。
  • 橙色/黄色网格 是 AHE 栅格化结果。

默认 (all_touched=False):

  • 仅当 像元中心 落在某个多边形内时,才会赋值。如果建筑面积小于 像元大小,则可能完全错过某些建筑(导致空白区域)。
  • 可能导致 小的多边形被忽略,特别是当多边形比像元小的时候。

在这里插入图片描述
根据结果图,可知结果并不合理。all_touched=False 导致部分建筑没有被正确映射到 50m 栅格。

all_touched=True:

  • 只要 多边形 与像元有交集,就会影响该像元的值。
  • 可能导致 多个多边形的值累加到同一个像元,造成 AHE 过高或过低。

在这里插入图片描述
一个多边形(建筑)的 AHE 值可能会被多个像元共享,但不会重复计算:

  • 如果 建筑面积大于 50m × 50m,它自然会覆盖多个像元,每个像元都会得到一部分 AHE。
  • 如果 建筑面积小于 50m × 50m,但跨越了两个像元,则这两个像元都会受到影响(不会导致总值变大,而是分摊 AHE)。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WW、forever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值