做InSAR时间序列的朋友,多多少少都听过PITSAR这个名字。它是Python写的一套InSAR时序分析工具,专门用来接ISCE产出的干涉图堆栈,做SBAS和PS反演,最终给出毫米级的形变速率和时间序列。用一句话概括:干涉图生产完以后,真正“盘活”这些数据的就是PITSAR这类工具。这篇文章把我实际使用PITSAR的经验摊开讲,从环境搭建、数据处理到参数调试和踩坑,尽量把你可能走弯路的地方提前指出来。适合刚接触InSAR时序、准备处理Sentinel-1数据的研究生或工程师参考,也适合准备从GAMMA转向开源工具链的从业者。
1. PITSAR到底是什么:一个能帮你把InSAR数据“盘活”的库
1.1 InSAR时序分析的痛点与PITSAR的定位
先聊为什么需要它。合成孔径雷达干涉测量,也就是InSAR,基本原理是用两景SAR数据的相位差来测量地表形变。单幅干涉图看着漂亮,但里面混着有大气延迟、轨道误差、地形残差。一次干涉的形变信号,经常被各类误差项淹没。时序InSAR的思路,就是用同一区域几十甚至上百景数据,把所有干涉图放在一个网络里反演,把系统性误差和真实形变分离。这个思路最常用的两种实现,一个是SBAS小基线集,一个是PS永久散射体。
PITSAR做的工作,正好就是这个“反演”环节。它在功能上相当于把商业软件里的时序模块开源化。输入是ISCE做好的干涉图堆栈,输出是速率和时间序列,中间的相位解缠、网络平差、大气滤波都封装成了可调用的模块。对研究者来说好处很直接,你不需要自己去写最小二乘平差的核心代码,却能看到每一步的中间结果。对于只用过GAMMA这类商业软件的人,PITSAR最大的价值是透明,你可以随时打开源码查看“这一步到底对相位做了什么”。
1.2 PITSAR能处理哪些数据与输出什么
PITSAR最顺手的数据来源是Sentinel-1,因为ISCE对Sentinel-1 TOPS模式支持得最好。ALOS-2、TerraSAR-X也可以,前提是ISCE能把干涉图堆栈按PITSAR需要的目录结构产出来。数据分辨率、轨道参数这些差异,对PITSAR来说影响不大,它更关心的是你喂进来的干涉图本身质量如何。
处理完之后,你会得到几样东西:平均形变速率图、累计形变时间序列、残差相位图。速率图适合直接叠加到GIS里出图,时间序列适合在单个像元上画曲线做物理解释。对于做地面沉降、矿区形变、滑坡监测的人,这套输出基本够用了。如果你还想要中间诊断产品,它一般也会保留每个步骤的临时文件,比如滤波后的相位、解缠后的相位、网络初步反演结果,方便你定位“结果不对劲到底出在哪一步”。
另外,PITSAR还有一批后处理脚本,可以帮你做空间滤波和时间滤波,把大气相位估出来并从时序里扣掉。这一步日常用得很多,因为不做大气校正的话,很多小区域的形变信号会被掩盖。
1.3 谁适合用PITSAR
学生和科研人员是最典型的用户,因为整套流程开源免费,适合折腾。做工程项目的朋友也可以把PITSAR当成算法内核集成进自己的流程,只要你对Python和Linux有一定基础。如果完全没碰过Linux和遥感数据处理,我建议先跑通一个ISCE的基础干涉流程,再来碰时序部分,否则在哪里卡住都不知道。
从另一个角度看,PITSAR也适合那些想摆脱黑盒工具的人。你可能会在毕业论文或项目报告里写“使用了PITSAR进行SBAS反演”,但如果你说不清楚它内部到底怎么解算,评审一问就露馅。把这篇文章里讲到的原理和参数逻辑弄明白,至少能应付大多数提问场景。
2. 环境准备与工具链选型
2.1 为什么通常把ISCE和PITSAR搭配使用
很多第一次接触PITSAR的人会问:PITSAR是不是一个“大而全”的InSAR软件?不是。PITSAR把重心放在干涉图之后的时序反演,多视、滤波、相位解缠这些步骤,它不打算重复造轮子。ISCE则相反,它对原始SAR数据做配准、干涉、滤波、解缠,输出组织好的堆栈。两者一个管生产,一个管分析,天然互补。
更重要的是,PITSAR熟悉ISCE的目录命名约定。ISCE的stack流程处理完,会生成类似merged/interferograms的树状结构,PITSAR可以直接识别哪些是干涉图、哪些是解缠图、哪些是相干性文件。目录名一旦对不上,PITSAR找文件就会很痛苦,所以提前把工具链约定好非常关键。商业软件用户如果用GAMMA做干涉图,想要接进PITSAR也不是不行,但需要把数据整理成它能识别的命名和栅格格式,工作量不小。既然PITSAR官方就是按ISCE习惯设计,直接用ISCE是最省事的选择。
2.2 安装步骤与版本坑
安装PITSAR前,先把ISCE装好。实际踩下来最稳的方法,是先用conda单独建一个环境,避免和其他项目的Python包互相干扰。有个干净环境的好处是,后面跑大量数据时不用反复担心某个库版本冲突。具体可以这样:
conda create -n insar python=3.8 conda activate insar conda install -c conda-forge isce gdal numpy scipy matplotlib h5py装完ISCE之后,再从GitHub把PITSAR仓库clone下来并安装:
git clone <PITSAR的官方仓库地址> pitsar cd pitsar pip install -e .我自己第一次装的时候踩过的坑是这样的:先pip install pitsar,结果运行时报错说找不到某个ISCE模块。后来才发现,PITSAR运行时会主动import ISCE的库,所以必须先保证ISCE在同一个conda环境里能正常import。顺序反了,就算装完也会出现一堆奇怪的ModuleNotFoundError。还有一次我图省事用了系统Python,结果系统Python里已经有一个老旧的numpy版本,导致PITSAR里某个矩阵运算报错,换成conda环境后问题立刻消失。
提示:PITSAR部分早期代码是在Python2时代写的,现在务必用Python3环境。装完记得用示例数据跑一遍完整流程,这一步能省下后续调试的三五个小时。
2.3 建议的数据目录结构
用ISCE跑完stack之后,通常建议把数据整理成类似下面的结构:
/path/to/project/ ├── dem.dem ├── dem.wgs84 ├── merged/ │ ├── interferograms/ │ │ ├── 20180101_20180113/ │ │ ├── 20180101_20180125/ │ │ └── ... │ ├── geocoded/ │ └── ... ├── config.txtPITSAR关心的是merged下哪些干涉图参与反演。你在stack里生成了100对干涉图,不代表都要喂给SBAS。时间基线特别长的、相干性特别差的、解缠质量明显不行的,完全可以不参与。所以我习惯在merged之外单独维护一张干涉图清单,内容是“序号、日期对、相干性均值、是否参与”,这个清单也是后面调参的第一手依据。没有这张表,你对着几百个目录名根本记不住谁是谁。
3. 实操流程:跑通一次SBAS时序
3.1 第一步:确定研究区和裁剪范围
时序处理最大的敌人是数据量。完整一条Sentinel-1的条带,干涉图堆栈可能占几十GB甚至上百GB。第一次调试时,强烈建议只保留研究区附近的一个小窗口,并行数也不要开太高,先把流程跑通再说。
裁剪有两种常见做法:一种是在ISCE stack阶段就裁剪,另一种是在PITSAR读取时通过配置文件指定行列范围。后一种更适合调试,因为你可以快速比较不同裁剪大小的效果而不必重新生产数据。我自己习惯用后一种,先设定一个200x200像元的窗口把流程跑通,确认反演结果合理之后,再逐步扩大。等窗口变大之后,内存压力会显著上升,处理时间也会从分钟级变成小时级,这是完全正常的。
我见过有人直接拿全条带数据跑,结果跑了三天才意识到参考点没选好,等于所有计算全部白费。顺序很重要:先小区域验证,再上全量。
3.2 第二步:筛选干涉图组合
SBAS的核心思想是“小基线”,也就是时空基线都不能太大。空间基线太大会导致去相干,时间基线太大会导致植被区相位不稳定。筛选时我常用的原则:
- 空间基线控制在150米以内,严格的时候压到100米;
- 时间基线按研究区植被情况灵活设置,城市区可以到100天以上,农田和林区最好控制在60天以内;
- 如果数据来自多个轨道,不要混在一个SBAS网络里反演,除非你做了轨道精校正且验证过一致性;
- 同一时间段内,优先保留相干性明显更好的干涉对。
这些标准没有统一答案,季节和地物差异很大。冬季的干涉图相干性往往明显好于夏季,因为植物落叶后相位稳定性更高。筛选完干涉图后,要检查一下整网的连接性。SBAS反演要求干涉图网络把每一景数据连成一张图,如果某些日期的景没有任何干涉图连到网络上,这一景参与反演时不仅没帮助,可能还会让矩阵更病态。
3.3 第三步:编写PITSAR配置文件并启动
PITSAR一般不是让你在交互式Python里敲一行命令就完事,而是通过一个配置脚本把参数传给反演模块。配置里最核心的几类参数是:
- 数据路径类:merged目录位置、DEM路径、干涉图列表;
- 反演参数类:参考点坐标、滤波窗口大小、是否做大气校正;
- 输出控制类:输出目录、需要导出的中间结果。
一个简化的配置看起来是这样,不同版本字段会略有差别,以你本地README为准:
[data] data_dir = /path/to/project/merged dem = /path/to/project/dem.wgs84 mask = /path/to/project/mask.rdr [sbas] ref_x = 152 ref_y = 240 filter_strength = 2 unwrap_threshold = 0.35 atmos_filter = true然后启动脚本大致是:
from pitsar.insar import sbas config = load_config('config.txt') sbas.run(config)这里写的是我习惯的调用方式。PITSAR的API各版本存在调整,实际使用时先读一下项目里的example脚本,通常一两分钟就能对上。启动之后,会看到日志滚动。第一次跑的时候,重点看两处:一是“读入多少景、多少对干涉图”,二是“反演矩阵是否满秩”。前者告诉你配置有没有读对,后者告诉你网络连接是否健康。如果矩阵不满秩,多数情况是干涉对没有把所有的日期“串”起来,需要回去补几对小基线的干涉对。
3.4 第四步:检查中间结果
反演完成后,先别急着换大范围。每次拿到第一版结果,我会先打开速率图看几眼:
- 速率图上是否出现明显的“条纹”或“棋盘格”,如果有,多半是解缠误差或轨道残留没有消除干净;
- 参考点所在的像元是否接近0。参考点本身是人为假设的零形变点,如果它自己的速率都不接近0,说明参考点位置或者相位网络平差有问题;
- 速率图有没有跨越断层、河流这种突然跳变的边界,如果有,先想想是不是真实形变,再考虑是不是解缠跳变。
时间序列也是一个验证的好工具。挑一个熟悉的地物目标,比如一座稳定建筑、一条道路交叉口,如果那里的累计形变在毫米级抖动而没有任何趋势,说明整体流程是干净的。如果时间序列上有莫名其妙的台阶,通常是某一对干涉图出现整周跳变,把那一对剔除后重跑就行。
4. 参数背后的原理与结果解读
4.1 SBAS反演原理落地到参数选择
SBAS从数学上看,就是解一个带正则化的最小二乘问题。每一幅解缠干涉图是不同日期之间相位差的观测值,所有干涉图放在一起,就变成了对未知相位时间序列的线性方程组。当干涉图网络是欠定的,需要用SVD求最小范数解,这时候正则化参数就变得很重要。PITSAR里对网络平差这部分有默认算子,普通场景直接使用默认值即可,但当你的干涉图数量特别少,或者网络严重不完整时,手动调节会让结果稳定许多。
参考点坐标是最容易被忽略的参数。很多人随便在图上点一个位置,结果整个速率图都带有偏差。参考点必须是长期稳定的地物,最好是裸岩、人工建筑物这类强散射体,远离植被和季节性水体。我习惯先在平均幅度图上找高相干点,然后对照光学影像确认,选点这一步值得花20分钟。参考点选对了,后续所有形变速率图才有一个可靠的零基准;选错了,整个区域的形变值都会整体偏移,而且你很难看出来哪里错了。
滤波窗口大小也一样。窗口越大,噪声压得越平,但真实形变细节也被抹得越厉害。在城市沉降监测里,我一般用5x5到7x7的窗口;在矿区这种形变梯度大的地方,窗口太大会让漏斗边界变得肥大,反而不好定量解释。这个参数没有通用最优值,最好针对研究区多跑两个窗口对比。
4.2 大气相位与解缠误差的识别
时序InSAR里最坑人的不是形变反演本身,而是大气相位。水汽分布不均时,干涉图上会出现像云朵一样的相位延迟,这种信号空间尺度大、时间变化快,很容易被误判为地壳形变。PITSAR常规会给大气估计。原理是利用大气相位在时间维上的高频特性,用时间高通滤波把形变信号和大气信号分开。实际使用中,我建议至少保留两个版本的输出:一个是不做大气校正的原始结果,一个是扣过大气的结果。两者对比一下,你就能知道大气对研究区的影响究竟多大。
解缠误差就更隐蔽。一个像元一旦解缠差了一个整周,反映到时间序列上就是一条跳变。检查方法是绘制残差图,如果残差图上存在明显的空间聚集模式而不是随机噪声,那大概率就是某几对干涉图的解缠出了问题。这时候宁可把那几对干涉图剔除,也不要硬留在网络里。一个错误干涉对的破坏力,往往超过十个正常干涉对的贡献。
4.3 结果导出的常见格式与GIS使用
PITSAR输出的GeoTIFF可以直接拉进QGIS或者ArcGIS里叠加浏览。我在出图时一般会再加一步后处理:把相干性阈值过滤后的像元设为无效值,避免把噪声像元画成“好看的形变”。具体阈值可以根据研究区质量在0.3到0.5之间选,这个没有绝对标准,但至少让你的图在汇报时更可信。
速率图里的单位是毫米/年,负值代表远离卫星方向,也就是通常在沉降或地壳拉张;正值代表靠近卫星方向,可能是抬升。如果是Sentinel-1降轨数据,靠近卫星方向大致对应地表抬升,具体还要结合轨道几何,不要想当然。写报告或论文时,也要明确写清楚“视线向形变”,而不是直接说垂直形变,除非你已经做了升轨和降轨的联合解算。
5. 常见错误与排查技巧
5.1 常见错误速查表
以下是我在PITSAR处理中真正遇到过的几类典型问题,整理成一张速查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 找不到merged目录 | 配置路径写错或ISCE输出结构不符 | 检查data_dir路径,对比README中的目录约定 |
| 干涉图数读入为0 | 文件名或扩展名匹配不上 | 确认文件名规则,必要时用glob规则匹配 |
| 反演矩阵奇异或病态 | 网络连接太差、孤立日期太多 | 增加小基线干涉对,或剔除孤立日期 |
| 速率图出现条带 | 轨道误差或长波长大气未消除 | 先做轨道精校正,再启用大气滤波 |
| 参考点处速率不为0 | 参考点选在形变区或低相干区 | 重新选点并查看该点的相位稳定性 |
| 内存不足 | 窗口太大或数据未裁剪 | 减小窗口、裁剪范围,并行任务数降低 |
| 输出时间序列有跳变 | 某对干涉图解缠错误 | 画出残差图,删除对应干涉对后重跑 |
| 相位时间序列整体偏离 | 参考点基准不一致 | 检查参考点位置在每景中的相位值一致性 |
这张表不是特别完备,但它覆盖了绝大多数“流程通了但结果不对”的场景。每次拿到异常结果,我第一件事就是先看参考点,第二件事看残差图,这两个地方能解决一半问题。
5.2 实测中值得抄下来的避坑经验
第一,不要一上来就全数据跑。我见过有人把300景数据直接丢进SBAS,结果跑了三天后才发现参考点选错了,等于全部白跑。正确做法是小窗口、低分辨率先验证,确认所有参数都是合理的,再上全量。
第二,干涉图的筛选比反演参数的调整更影响结果。与其反复调滤波窗口,不如先回去删掉几对明显有问题的干涉图。少而精的连接网络,通常比“大而全”的网络结果稳定得多。我自己的观察是,60到80对质量中上的干涉图,往往比150对“来者不拒”的干涉图网络给出的形变场更平滑、更连续。
第三,注意升轨和降轨数据。如果你只有一种轨道的数据,形变速率只有视线向分量,解释的时候不要直接说垂直形变,只能说视线向形变,这是很多新手写报告时容易犯的表述错误。要得到真正的垂直形变,需要升轨和降轨数据联合解算。
第四,定期存档中间结果。PITSAR每一步都产中间文件,目录名带日期或版本号,方便回溯。过程文件一多,磁盘几周就会被填满,处理完后及时把不需要的粗产品清理掉。别等磁盘满了再清,那时候你可能已经忘记哪些目录是中间产物了。
6. 应用场景扩展与后续学习
6.1 从SBAS到PS点技术
PITSAR除SBAS外也适合做PS类分析,思路是选出长时间保持高相干的散射体,用这些点反演形变。PS分析和SBAS参数侧重不一样,它更关注点目标、去平相位、残余轨道等。城市区域用PS效果通常很好,因为建筑物上强散射点密集。如果你做农村或者山区,PS点稀疏,SBAS面积型结果更实用。不少人在实际项目里会把两者结合使用:PS点用来识别微观形变和稳定地物,SBAS用来获得连续面状形变场,然后互相印证。
6.2 外部大气校正产品怎么接
如果研究区有可用的外部大气延迟产品,比如连续运行参考站或大气模型网格数据,可以直接在反演前把大气相位估计出来并从干涉图中扣掉。这个整合思路很实用,因为PITSAR自带的时间维滤波只能处理部分大气信号,空间尺度大于干涉图范围的大气延迟,单靠数据集内部信息很难完全约束。
具体操作不复杂,核心是把外部大气相位转换到雷达坐标或者地理坐标,然后从解缠相位中减去。做完这一步,再看速率图上的低波数噪声,通常会有肉眼可见的改善。如果你要做高精度形变监测,这一步值得投入时间。
6.3 后处理与融合分析
时序形变结果很少单独用,常见做法是和光学影像、降雨、地下水位数据放到一个系统里综合解释。PITSAR导出的GeoTIFF可以直接被Python的rasterio、geopandas读取,把形变速率图与地下水位测站的散点位置叠加,就能快速判断沉降与水位下降的相关性。同理,将滑坡形变时间序列与降雨曲线画在一起,可以直观看到雨季加速和形变响应之间的时间滞后。
这种叠加分析不需要复杂的WebGIS系统,本地跑一个Python脚本就能做。我在一次矿区沉降分析里,把形变速率图和采空区边界重叠,发现高形变区与采空区边界的吻合度非常高,这种对比比单纯出一张速率图更有说服力。
6.4 下一步学什么
如果PITSAR基本流程已经没问题,我建议接下来弄懂三件事:一是干涉图网络质量评估,二是大气相位时空特性,三是误差传播和协方差估计。这些概念不只在PITSAR有用,换到别的InSAR平台同样适用。工具只是入口,真正值钱的是背后那套形变反演的物理模型理解。
我个人在实际操作中的体会是,PITSAR最擅长的不是让复杂的事情变简单,而是让那些重复劳动变成可控的流程。它的学习曲线不算陡,卡壳最多的永远是数据预处理和网络筛选,而不是反演本身。如果你正准备拿Sentinel-1数据做自己的第一套时间序列,我的建议是:先跑一个小区域,把每一步输出都看懂,再扩大范围。这套流程跑熟练以后,一景一景的SAR数据就不再是分散的干涉图,而是一张能说话的形变演化图。