【ArcGIS Pro】将shp文件转换为栅格raster数据教程:Python处理代码详解

目录

  • 准备工作:带取值的shp文件
  • 查看shp文件坐标系
  • 确保 Value Field(值字段) 类型正确
  • 方法 1:使用 ArcGIS Pro 的 “Polygon to Raster” 工具
  • 报错1:输出结果为3.40282e+38(无效值)
  • 方法2:Python代码
  • all_touched=True/False
  • 参考
  • 要将带有取值的 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)。
  • 参考

    作者:WW、forever

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【ArcGIS Pro】将shp文件转换为栅格raster数据教程:Python处理代码详解

    发表回复