如何通过Python从DEM文件生成坡度和坡向数据
一般来说,DEM地形数据转坡度和坡向的操作,都是通过ArcGIS来完成。
但 是 (这里有一个Big BUT),主包真是觉得ArcGIS的很多软件设计和操作方法不太方便,所以就想用Python来替代以下,而且直觉上也完全是可以完成的,不就是数学计算吗。
所以,我就开始了尝试......
跑通之后,总结一下整体步骤为后续有需要的同学做点小贡献。
其实操作起来不难,就是需要选择好合适的工具:
首先,就是库文件选择与安装(最关键步骤)。
坡度和坡向数据计算库文件主要有如下几类:richdem、GDAL、arcpy
RichDEM
首先,richdem,我个人不建议使用,我就是为了搞定这个库文件浪费了很多时间最后走不通,因为RichDEM的核心功能是用高性能C++ 编写的(特别是地形分析算法),Python只是一个"外壳",实际计算由C++模块_richdem.pyd
执行,所以安装起来比较麻烦。
感兴趣的同学也可以自己尝试,反正我安装的时候就是各种报错......
GDAL
GDAL相对来说最容易操作,这是一个非常强大的开源库,可以处理各种栅格和矢量数据格式。Python 中可通过 osgeo 模块来使用 GDAL。
import os
from osgeo import gdal
from osgeo import gdalconst
ArcPy
我自己选择的是arcpy,没有什么有说服力的理由,只是因为这是ArcGIS自带的库文件,所以我觉得它的计算精度或者可靠性更高一点(纯主观,未验证)。
但是,这个操作起来其实也有一点点麻烦,因为arcpy 并不是一个可以通过 pip 或 conda install 从公共仓库(如 PyPI、conda-forge)直接安装的库。
arcpy 是 ESRI ArcGIS 软件自带的 Python 模块,它是一个专有的(Proprietary)库。 这意味着:
-
必须安装了 ArcGIS Desktop (ArcMap) 或 ArcGIS Pro 软件。
-
arcpy 模块会随 ArcGIS 软件一起安装,并集成到其自带的 Python 环境中。
-
不能像安装其他 Python 库一样,在任意的 Conda 环境或通过 pip 命令来安装 arcpy。
所以在使用arcpy进行坡度坡向计算时,必须得在ArcGIS自带库文件的环境中去运行代码。
下面仔细说一下如何配置ArcGIS的环境:
-
找到 ArcGIS Pro 自带的 Python 环境:
-
默认情况下通常在:C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3
-
如果在 ArcGIS Pro 中创建了新的环境,其路径可能类似:C:\Users\<YourUsername>\AppData\Local\ESRI\conda\envs\<YourCustomEnvName>
-
-
方法 A: 直接激活并使用该环境
-
打开命令行工具(如 Anaconda Prompt 或 PowerShell)。
-
直接切换到 ArcGIS Pro 自带的 Python 环境:
-
如果 ArcGIS Pro 默认环境路径是 C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3
-
您不能直接用 conda activate arcgispro-py3 (除非手动将其添加到conda已知环境列表中,但这不常见)。
-
最直接的方式是使用该环境的完整路径来执行 Python 脚本,或者直接运行该环境中的 python.exe。
-
-
"C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\python.exe" your_script.py
-
方法 B: 在 IDE (如 VS Code, PyCharm) 中配置解释器
-
打开IDE,我用的时VS Code。
-
找到项目或工作区的 Python 解释器设置。
-
选择或添加解释器,并指定 ArcGIS Pro 自带的 python.exe 路径(例如:C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\python.exe)。
-
这样,在 IDE 中运行脚本时,就会使用这个包含 arcpy 的环境。
-
然后输入C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3即可,具体路径是什么得看自己的配置,选到arcgispro-py3这一级就行。
配置好后,就可以开始写代码运行了,这一部分还需要注意几个问题。
- 导入arcpy的时候,要把Slope和Aspect都单独导入,不然函数名称不太对
import arcpy
from arcpy.sa import Slope, Aspect
- 确认好DEM文件路径,同时不要修改内部的文件名,不然可能会出错
验证方法:
-
手动打开文件资源管理器,导航到 F:\DATA\DEM\。
-
确认里面有一个名为 dem_1km 的文件夹。
-
进入 dem_1km 文件夹,确认里面有 hdr.adf、w001001.adf 等文件,这些是 ESRI Grid 格式的内部文件。
为了帮助调试,可以在脚本中添加一个检查路径的语句:
import os # 在脚本开头添加这行
# ... (其他导入和环境设置) ...input_dem = r"F:\DATA\DEM\dem_1km"# --- 检查输入路径是否存在 ---
if not os.path.exists(input_dem):print(f"错误:输入数据集路径 '{input_dem}' 不存在。请检查路径是否正确。")exit() # 如果路径不存在,则退出脚本# ... (后续计算代码) ...
OK,到这里基本就能够完美运行了。
可以导入到ArcGIS检查一下。
多吐槽一句,地形数据的格式确实麻烦,还不能拆开,必须以文件夹形式输入,不知道有没有好的解决办法......