1. 为什么要在Windows里折腾MintPy
1.1 MintPy是什么,到底能干什么
MintPy(Miami InSAR time-series software in Python)是InSAR时间序列分析里非常常用的一个开源工具包。如果你做合成孔径雷达干涉测量,对SBAS、PS-InSAR这些名词应该不陌生,MintPy就把这些时间序列算法封装成了一套相对统一的流程:输入干涉图、相干性、差分相位、高度等数据,经过网络解算、大气校正、相位解缠残差处理,最后输出位移时间序列、平均速度场、累计形变图这些产品。
它支持的输入格式很多,包括ISCE、GMTSAR、ROI_PAC、Gamma等主流InSAR处理软件的成品数据。所以不管你的干涉图是从哪条处理链路出来的,只要数据格式能对齐,MintPy基本都能接手做时间序列分析。这也是它被大量用于火山形变、地震同震/震后形变、滑坡监测、地面沉降研究的原因。
我接触MintPy比较早,但一直习惯在Linux服务器上跑。直到最近因为项目原因,必须在Windows本机处理一批测试数据,才认真研究了一下Windows安装的可行性。结论是:能装,而且Python 3.12 + Conda的组合完全走得通,只是有几个坑需要提前避一避。
1.2 为什么非要用Conda:GDAL和Cartopy才是真正的难点
很多人看到MintPy的第一反应是pip install mintpy,在Windows上直接这么干的,大概率会碰一鼻子灰。原因在底层依赖。
MintPy的核心依赖里有几个是带C扩展的硬骨头:GDAL、Cartopy、H5Py、NumPy、SciPy、OpenCV。其中GDAL和Cartopy在Windows下尤其麻烦。GDAL本身就是一个庞大的C++库,它要链接Proj、GEOS、HDF5、NetCDF等一系列原生库;Cartopy底层依赖Shapely和Proj,Shapely又要链接GEOS。pip安装这些包时,如果环境里没有对应的原生库或者版本对不上,要么当场编译失败,要么装上了但import时报DLL Load Error。
Conda的强项恰恰在这里。它不是像pip那样逐个装Python包,而是把Python包和底层的原生库放在同一个二进制环境里统一管理。你装一个GDAL,它会把匹配的Proj、HDF5、GEOS、OpenJPEG一起拉进来,版本之间互相兼容。这就是为什么在Windows上装MintPy,Conda几乎是唯一靠谱的路线。
1.3 安装前要想清楚的几件事
在开始敲命令之前,有几个前置判断建议先做,能省掉后面很多返工:
第一,系统必须是64位的Windows。MintPy以及它依赖的GDAL、Cartopy在Windows上基本只有64位发行版,32位系统直接放弃吧。Windows 10/11的64位版本都没有问题。
第二,Python版本选3.12是OK的。MintPy从1.5.x开始就逐步适配了Python 3.12,到1.6.x版本已经可以比较稳定地跑在3.12上。如果你用的是旧版MintPy,比如1.4.x,那在3.12上遇到NumPy 2.x兼容问题的概率会高很多。所以建议装最新版MintPy,不要用老版本。
第三,建议给MintPy单独建一个Conda虚拟环境,不要装在base里。一是避免和日常开发环境互相污染,二是MintPy对依赖版本有比较明确的要求(比如GDAL版本和Cartopy版本必须和Proj匹配),独立环境里可以随便折腾,出了问题直接整个环境删掉重建,成本很低。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:先把Conda这层地基打好
2.1 装Miniconda还是Anaconda
我的建议是装Miniconda,不装Anaconda。Anaconda自带的几百个包对MintPy来说大部分用不上,白白占空间不说,装完还经常遇到conda和pip混装导致环境混乱的问题。Miniconda只带conda、Python和少量核心工具,干净利落,后面需要什么依赖用conda现装就行。
下载地址是Miniconda官方页面,选Windows 64位版本。安装过程有几点需要注意:
- 安装路径不要有中文、空格和特殊符号,建议直接装到
D:\Miniconda3这种目录。 - 安装过程中有一个“Add Miniconda3 to my PATH environment variable”的选项,建议勾上。虽然网上很多人说不要勾,但从实际使用角度讲,勾上之后能在CMD和PowerShell里直接用conda命令,方便很多。不勾的话,每次都得打开Anaconda Prompt,交互体验差一截。
装完打开一个新的CMD窗口,输入conda --version,能输出版本号就说明基础环境OK。如果提示conda不是内部或外部命令,大概率是PATH没生效,重新打开终端,或者手动把Miniconda3和Miniconda3\Scripts、Miniconda3\Library\bin加进系统环境变量。
2.2 配置国内镜像源,别在下载上浪费时间
Conda默认源在国外,装MintPy这种依赖一堆的包,下载速度能慢到怀疑人生。我建议一开始就换成清华的TUNA镜像源。
打开CMD,执行下面的命令写入.condarc配置:
bash复制conda config --set show_channel_urls yes
conda config --add channels conda-forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
conda config --set channel_priority flexible
然后在用户目录下找到.condarc文件,内容应该是类似这样的:
yaml复制channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- conda-forge
- defaults
show_channel_urls: true
channel_priority: flexible
有两个细节要说明一下。一是conda-forge必须保留,MintPy的主包以及很多科学计算依赖只有conda-forge才有,tuna镜像也同步了conda-forge的包,所以下载时还是会走镜像,速度不用担心。二是channel_priority我建议设成flexible,如果设成strict,conda会优先从第一个channel找包,有时候反而导致某些老版本包解析失败。
2.3 创建MintPy专用环境
基础配置做好之后,创建MintPy的独立环境:
bash复制conda create -n mintpy python=3.12 -y
conda activate mintpy
激活成功后,CMD提示符前面会多出(mintpy)字样。这时候验证一下:
bash复制python --version
conda info --envs
python --version应该输出Python 3.12.x,conda info --envs能看到mintpy这个环境。如果conda activate报错说run 'conda init' before 'conda activate',在CMD里执行一次conda init cmd.exe,关掉终端重新打开再试即可。PowerShell用户则改执行conda init powershell。
3. MintPy安装的三种方式,我建议你走源码安装
3.1 依赖优先级:底层库先装,MintPy后缀
我踩过好几次的坑是:直接一把梭conda install mintpy,结果conda在那里解算依赖解算了十几分钟,最后要么报找不到匹配版本,要么装完import时报DLL错误。问题的根源是MintPy依赖的GDAL、Cartopy、H5Py等底层库彼此之间版本关联很敏感,一次性全量安装时conda的解算器需要在几百个包之间找一组兼容版本,很容易卡住。
更稳妥的做法是分两步走:先装底层计算和绘图依赖,再装MintPy本体。具体来说,第一步先装这些:
bash复制conda install -c conda-forge gdal cartopy h5py numpy scipy matplotlib pyyaml opencv dask joblib pyproj -y
这里面GDAL和Cartopy是关键的锚点包,先把它们固定下来,后面装MintPy时conda不需要再从零开始解算整棵依赖树,速度快很多。等这一步装完,再装MintPy本身。
3.2 最省事的路线:conda-forge一把梭
如果你不想折腾,直接执行:
bash复制conda install -c conda-forge mintpy -y
这套路在Python 3.12环境里实测是能装上的,conda会把MintPy以及它缺失的依赖自动补齐。缺点是解算时间不可控,我第一次跑的时候等了将近二十分钟,中途一度以为卡死了。而且如果底层依赖版本比较乱,比如环境里已经有一个不兼容的Proj,conda可能分析到最后给出一个“无法找到兼容版本”的错误。
所以这种方式适合从零开始的环境,或者你对conda解算失败的容忍度比较高的场景。如果遇到解算慢的问题,可以装一个mamba加速:
bash复制conda install -c conda-forge mamba -y
mamba install -c conda-forge mintpy -y
mamba是用C++重新实现的conda解算器,速度能快好几倍,遇到依赖冲突时给出的信息也更明确。我后面重装环境时基本都是直接用mamba。
3.3 pip路线:能用,但要满足前提条件
也有人习惯用pip install mintpy。这个方法不是不行,但有一个前提:环境里必须已经装好了能正常import的GDAL和Cartopy。否则pip在装mintpy时会尝试把它认为需要的依赖装一遍,很多带C扩展的包没有预编译wheel,在Windows上就现场编译,基本是装一个挂一个。
我的建议是:如果走pip,那么GDAL和Cartopy必须用conda先装好,剩下的纯Python依赖再交给pip解决。
bash复制conda install -c conda-forge gdal cartopy -y
pip install mintpy
这种方式的好处是mintpy本体以及它的轻量依赖用pip装得很快,坏处是如果后续要改MintPy源码、跟进最新修复,pip装的方式不方便。另外要小心pip把conda已经装好的numpy、scipy给升级或降级了,一旦pip动了这些核心包,整个环境很可能直接崩掉。建议在pip install时锁定关键包版本,比如numpy==2.1.3、scipy==1.14.1这类写法。
3.4 推荐路线:源码安装,方便改代码也方便跟版本
我个人推荐用源码安装。理由有三:一是MintPy迭代很快,conda和pip上的包版本可能滞后,但从GitHub拉最新代码能第一时间用上新功能和修复;二是MintPy的配置文件、小工具脚本、测试数据都跟着源码仓库走,源码安装后这些东西都在本地,排查问题时方便;三是以后更新只需要git pull,不用重新安装。
具体步骤:
bash复制git clone https://github.com/insarphp/mintpy.git
cd mintpy
pip install -e .
pip install -e .是开发模式安装,它不会把MintPy复制到site-packages里,而是在当前目录创建一个链接。好处是你在本地修改MintPy的源码,下次运行立刻生效,不用重新安装。MintPy安装过程会读取setup.py里的依赖声明,自动补装缺失的包。
注意一点:源码安装前,3.1节里说的底层依赖还是要先用conda装好,这是保证GDAL、Cartopy、H5Py这些C扩展包版本稳定的前提。
4. 安装后的验证与Windows专属配置
4.1 用一行命令确认MintPy真的装好了
MintPy装好之后,我习惯先做三件事。
第一,看命令入口是否可用:
bash复制mintpy --help
新版本的MintPy安装后会在环境里注册mintpy命令,能正常输出帮助信息就说明主程序没问题。
第二,在Python里验证导入:
bash复制python -c "import mintpy; print(mintpy.__version__)"
如果能看到类似1.6.1的版本号,说明MintPy本体已经可以正常加载。这一步如果报错,比如ModuleNotFoundError: No module named 'mintpy',那说明安装路径有问题,检查一下是否在mintpy虚拟环境里,或者源码安装时是否在mintpy目录下执行了pip install -e .。
第三,验证辅助脚本:
bash复制smallbaselineApp.py --help
info.py --help
MintPy的整套流程基本都围绕smallbaselineApp.py这个小工具脚本展开,它能输出帮助信息,说明MintPy的脚本绑定也成功了。info.py则用来查看HDF5格式的InSAR数据文件里到底存了哪些数据集,实际用的时候非常频繁。
4.2 Windows下必改的绘图字体配置
MintPy用matplotlib出图,在Linux上中文支持不好顶多是显示成方块,但在Windows上还有另一个让人抓狂的问题:默认字体下,图里的中文标签、坐标刻度会出现锯齿状的乱码,个别版本还会在保存PDF时崩溃。
解决方法是把matplotlib的默认字体改成Windows自带的微软雅黑。MintPy的绘图模块在源码目录的mintpy/objects/plot.py里,打开这个文件,找到matplotlib的rcParams配置区域,加上或者修改这一行:
python复制import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False
第一行是把无衬线字体指定为微软雅黑,第二行是防止负号显示成方块。改完保存,重启Python进程,再跑出图就正常了。
如果你用的是源码安装,这个修改很简单;如果是conda或pip装的方式,找到plot.py所在路径的方式是:
bash复制python -c "import mintpy.objects.plot as p; print(p.__file__)"
然后用任意编辑器打开那个文件修改即可。
4.3 环境变量和路径设置的补充
Windows下还有一个容易被忽略的问题:GDAL有时候会找不到它的数据文件或者Proj数据库。如果跑MintPy时报错提示PROJ database not found或者GDAL_DATA相关的问题,需要在环境变量里手动指定。
先找到当前环境的GDAL目录:
bash复制python -c "from osgeo import gdal; print(gdal.__file__)"
然后在系统环境变量里新建:
GDAL_DATA:指向gdal-data文件夹,通常在D:\Miniconda3\envs\mintpy\Library\share\gdalPROJ_LIB:指向proj.db所在目录,通常在D:\Miniconda3\envs\mintpy\Library\share\proj
这个坑在conda-forge版本里出现的概率不高,但一旦出现,报错信息比较迷惑,网上搜到的解法大多也是绕来绕去。提前把这两个环境变量配好,能省事不少。
5. 常见报错与排查技巧实录
5.1 报错速查表:这几类问题我基本每次都会遇到
| 报错现象 | 可能原因 | 解决办法 |
|---|---|---|
'conda' 不是内部或外部命令,也不是可运行的程序 |
conda未加入PATH,或终端环境未刷新 | 重新打开CMD;或手动添加Miniconda3、Scripts、Library\bin到PATH |
CommandNotFoundError: Run 'conda init' before 'conda activate' |
conda没有初始化shell钩子 | 在CMD里执行conda init cmd.exe,PowerShell则执行conda init powershell,然后重启终端 |
ModuleNotFoundError: No module named 'mintpy' |
没激活mintpy环境,或者源码安装路径不对 | 确认conda activate mintpy;源码安装时确保在mintpy目录里执行了pip install -e . |
ImportError: DLL load failed while importing gdal |
GDAL与底层Proj或HDF5版本不匹配 | 用conda install -c conda-forge gdal=3.6.3 --force-reinstall强制重装,让conda自动修复配套原生库 |
AttributeError: module 'matplotlib' has no attribute 'verbose' |
matplotlib与numpy/matplotlib版本不兼容 | 重装matplotlib:pip install --force-reinstall matplotlib |
PROJ database not found |
环境变量PROJ_LIB缺失 | 设置PROJ_LIB指向Library\share\proj目录 |
| 出图中的中文显示成方块/齿状乱码 | Windows默认字体不含中文字符 | 按4.2节修改plot.py的字体配置 |
| conda解算依赖卡住十几分钟不动 | 包版本组合太多,解算器效率低 | 装mamba代替conda进行安装:mamba install -c conda-forge mintpy -y |
| 运行时报内存不足 | InSAR数据量大,Windows默认虚拟内存配置保守 | 增大页面文件大小;或者把输入数据裁剪成小区域测试 |
5.2 关于GDAL版本冲突的一次完整排查过程
这里想展开说一下GDAL版本冲突,因为这是Windows上最防不胜防的问题。
我遇到过一次很典型的情况:MintPy本身能安装,smallbaselineApp.py --help也正常,但真正跑数据时,第一步读取干涉图就报DLL load failed。查了一圈,最后发现是在3.1节里先装GDAL时,conda拉到了新版的GDAL 3.9.x,而这个版本链接的Proj库和后来MintPy隐式拉取的Cartopy版本所依赖的Proj库不一致。简单说,两个包都在用Proj,但用的是不同版本的Proj,Windows下一旦动态链接库冲突,就直接DLL Load Error。
解决办法也简单粗暴:把GDAL和Cartopy一起强制重装,让conda重新计算一组兼容版本。
bash复制conda install -c conda-forge gdal cartopy --force-reinstall -y
执行完之后再跑测试脚本,问题消失。这里面的教训是:如果依赖装到一半系统里已经存在多个版本的Proj/HDF5这类原生库,不要手动去删,直接让conda重新解算。
5.3 小技巧:遇到诡异报错先跑官方测试数据
MintPy官方在GitHub仓库里带了一套测试数据。装完环境后,我最建议做的一件事就是把测试数据跑一遍。这既是最有效的验证方式,也是排查环境问题的最快路径。
教程仓库里有一个test目录,里面有下载测试数据的脚本,具体命令:
bash复制python test/download_test_data.py
脚本会把一套小型测试数据(DixonTest)下载到test/data目录。下载完成后,进入该目录,运行:
bash复制smallbaselineApp.py smallbaselineApp.cfg
看到终端滚出处理日志,最后生成velocity.png、timeseries.h5这些结果文件,就说明整个MintPy在Windows上的链路已经全线打通了。如果这一步能跑通,后面处理你自己的项目数据基本不会遇到环境层面的怪问题。
6. 实测运行:跑通DixonTest算正式毕业
6.1 从数据解算到出图的完整流程
DixonTest这套测试数据的流程比较典型,smallbaselineApp.cfg里预置了从读取干涉图、网络解算、相位校正到最终输出的完整配置。运行smallbaselineApp.py smallbaselineApp.cfg之后,MintPy会按照配置里的步骤依次执行。你不需要手动干预,它会自动生成一系列中间HDF5文件和一个pic目录,里面是各个步骤的可视化检查图。
我对Windows下这套流程的评价是:能跑,但要有耐心。DixonTest的数据量在测试集里算小的,但在Windows上一口气跑完也需要几分钟时间。中间如果某个步骤报错,终端会给出比较明确的错误信息,按5.1节的速查表去对照排查就行。
6.2 Windows与Linux实际运行差异
跑了完整流程之后,我把Windows下生成的velocity.png、timeseries.h5和之前在Linux服务器上跑同一份测试数据的结果做了对比。数值层面没有任何差异,MintPy在Windows上的计算逻辑和Linux完全一致,结果文件可以直接互换使用。
差异主要体现在两个地方。一是性能,Windows原生环境下IO和进程调度效率比Linux稍弱,处理大型数据集时能感觉到明显的速度差距。如果你的数据量很大,比如上千景影像,我建议还是用Windows环境做算法验证和小规模测试,正式跑大数据量时切到WSL2或者Linux服务器。二是稳定性,Windows下偶尔会因为路径分隔符、系统字体等问题出现小报错,但都在可解决范围内,不影响最终结果。
6.3 一个容易忽视的路径编码问题
最后补充一个Windows专属的坑:路径编码。MintPy在读取配置文件时,如果存放数据的路径包含中文或者特殊字符,Windows默认的GBK编码和Python内部使用的UTF-8可能会冲突,导致读取路径时报错。解决办法很简单,所有工作目录、数据目录统一使用英文路径,不要用中文目录名。这个习惯从开始建环境时就要保持,能规避掉很多莫名其妙的坑。
最后再说两句
整套环境安装下来,我最想强调的是顺序。先把Conda和镜像源搞定,再建干净的环境,底层依赖分批装,MintPy最后装,装完立刻跑测试数据验证。这个顺序每一步都在降低后一步的复杂度,尤其是GDAL和Cartopy这两个锚点包先固定下来,后面所有依赖解析都快很多。
如果你在Windows上装MintPy的时间有限,按这个流程走一遍,大概率能在半小时内跑通。装完之后建议把测试数据跑完再正式干活,因为环境有没有暗坑,测试数据就是最好的试金石。这之后再去处理自己的InSAR数据,就不会被环境问题打断思路了。
