Python调用elevation.clip提取SRTM1/SRTM3高程失败,报CalledProcessError
解决python-elevation调用make命令失败的问题
问题重现
运行以下代码提取国家高程数据时触发错误:
dem_path = 'data/image_original.tif' output = os.getcwd() + dem_path bounds_combined = combined_polygon.bounds west_c, south_c, east_c, north_c = bounds_combined elevation.clip(bounds=bounds_combined, output=output, product='SRTM1') dem = rio.open(output) show(dem) raster = riox.open_rasterio(output) geom = combined_polygon clipped_raster = raster.rio.clip([geom]) dem_path1 = 'data/image_clipped.tif' output1 = os.getcwd() + dem_path1 clipped_raster.rio.to_raster(output1) dem = rio.open(output1) show(dem)
错误信息:
CalledProcessError: Command 'make -C /root/.cache/elevation/SRTM1 all ' returned non-zero exit status 2.
切换product='SRTM3'后问题依旧。
解决方案
1. 补全系统依赖
python-elevation依赖gdal、make、wget等工具,先确认这些工具已安装:
- Debian/Ubuntu系统:
sudo apt-get install build-essential gdal-bin wget - RHEL/CentOS系统:
sudo yum install gcc make gdal wget - macOS(Homebrew):
brew install make gdal wget
2. 清理损坏缓存
缓存目录内的文件可能下载不全或损坏,删除缓存后重新运行代码:
rm -rf /root/.cache/elevation
也可以在代码里手动指定有读写权限的缓存路径,避免权限冲突:
import elevation elevation.CACHE_DIR = '/path/to/your/writable/folder' # 替换为你有权限的目录
3. 修复权限问题
/root/.cache/目录需要当前用户有读写权限,若你以普通用户运行代码,可修改缓存目录权限:
chown -R your_username:your_username /root/.cache/elevation
或直接使用步骤2的自定义缓存路径。
4. 手动处理数据构建
如果自动下载失败,手动操作:
- 根据你的目标范围找到对应SRTM1/SRTM3分块数据
- 将下载的文件放到
/root/.cache/elevation/SRTM1(或SRTM3)目录下 - 手动执行make命令查看具体错误:
make -C /root/.cache/elevation/SRTM1 all
根据输出的错误信息针对性修复(比如文件缺失、解压失败等)。
5. 替换数据源
若python-elevation的SRTM数据源持续出问题,可改用rasterio直接调用公开DEM数据源,示例:
import rasterio as rio # 替换为对应范围的SRTM分块文件URL tile_url = "https://example.com/path/to/your/srtm/tile.hgt.zip" # 下载解压后,用rasterio打开并裁剪 with rio.open('解压后的文件路径') as src: clipped = src.rio.clip([combined_polygon]) clipped.rio.to_raster('data/image_clipped.tif')
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

