Rasterio rasterize函数矢栅转换异常:几何无效且输出空白
解决Rasterio栅格化折线Shapefile输出全0的问题
我来帮你拆解几个关键问题,这些应该就是导致几何验证失败、最终输出全0栅格的核心原因:
1. Fiona迭代器的「一次性遍历」坑
你用fiona.open()得到的shapeee是个一次性迭代器——当你第一次用[shapes['geometry'] for shapes in shapeee]提取几何后,迭代器的指针已经走到末尾了,第二次再提取属性时,得到的其实是空列表!这就导致后续生成的元组里没有有效属性值,栅格化自然全是0。
修复方法:一次性遍历所有要素,同时提取几何和属性:
import fiona from rasterio import features shapefile = "你的折线文件路径.shp" with fiona.open(shapefile) as shapeee: # 一次遍历完成几何与属性的配对 geom_attrib_pairs = [(feat['geometry'], feat['properties']['OBJECTID']) for feat in shapeee]
2. is_valid_geom的使用错误
rasterio.features.is_valid_geom是用来验证单个几何对象的,你把整个几何列表传进去,肯定会返回False。正确姿势是逐个验证:
for geom, val in geom_attrib_pairs: print(features.is_valid_geom(geom)) # 检查每个几何是否有效
3. Geopandas方案的生成器问题
你之前得到生成器,大概率是提取几何时误用了生成器表达式(比如(g for g in gdf.geometry))。用Geopandas的正确写法是直接生成(几何, 属性值)的元组对,Rasterio既支持GeoJSON格式,也支持直接传入Shapely对象:
import geopandas as gpd gdf = gpd.read_file(shapefile) # 方式1:转成GeoJSON格式 geom_attrib_pairs = [(g.__geo_interface__, g['OBJECTID']) for g in gdf.itertuples(index=False)] # 方式2:直接用Shapely几何对象(更简洁) geom_attrib_pairs = [(row.geometry, row.OBJECTID) for _, row in gdf.iterrows()]
4. 栅格化代码的两个细节错误
- 你原来的循环
range(0,len(geom_fiona)-1,1)会漏掉最后一个几何,应该直接用range(len(geom_fiona)); - 最关键的:栅格化时必须传入参考栅格的
transform参数!这个参数是几何坐标与栅格像素映射的核心,没传的话几何会被映射到错误位置,导致输出全0。
完整可运行示例代码
import rasterio from rasterio import features import fiona # 加载参考栅格,获取栅格尺寸与坐标转换参数 with rasterio.open("你的参考栅格路径.tif") as ref_dataset: out_shape = ref_dataset.shape transform = ref_dataset.transform # 这个参数一定要传! shapefile = "你的折线文件路径.shp" with fiona.open(shapefile) as shapeee: geom_attrib_pairs = [(feat['geometry'], feat['properties']['OBJECTID']) for feat in shapeee] # 执行栅格化 burned = features.rasterize( geom_attrib_pairs, out_shape=out_shape, transform=transform, default_value=-99, dtype=rasterio.float64 ) # 验证结果 print(f"栅格最小值:{burned.min()},最大值:{burned.max()}")
最后再确认两个点
- 确保Shapefile的
OBJECTID属性确实有非0的有效值; - 再次核对Shapefile与参考栅格的投影完全一致(你已经确认过,这条可以忽略)。
内容的提问来源于stack exchange,提问作者user11416216
相关产品推荐
相关产品推荐

