飞道的博客

ubuntu18中ISCE2.6+stamps实现PSInSAR时序地表形表处理

569人阅读  评论(0)

一 安装ubuntu
教程参考:https://baijiahao.baidu.com/s?id=1741674041146755999&wfr=spider&for=pc
建议安装18或者20版本,版本过高会导致版本不匹配的问题。

二安装Anaconda3
教程参考:https://zhuanlan.zhihu.com/p/269183148
注意安装的python环境建议为3.6-3.8版本,版本过高也会导致适配问题。

三安装isce2.6
教程参考:https://zhuanlan.zhihu.com/p/269183148
注意这里使用的在线安装,安装过程会存在失败的情况,多重复几次即可,网上很多离线安装的方法,也可以尝试下。
涉及到环境配置如下:

# ISCE2 #
export ISCE_HOME=/home/serena/anaconda3/envs/isce2_env/lib/python3.8/site-packages/isce
export PATH=$PATH:$ISCE_HOME/applications:$ISCE_HOME/bin
export ISCE_STACK=/home/serena/isce2
export prepStackToStaMPS=/home/serena/isce2/contrib/timeseries/prepStackToStaMPS
export PATH=$prepStackToStaMPS/bin:/home/serena/isce2/contrib/stack/topsStack:$PATH

其中export ISCE_HOME=/home/serena/anaconda3/envs/isce2_env/lib/python3.8/site-packages/isce,为在线安装成功后的文件路径,测试topsApp.py --steps --help
和topsApp.py -h就能提示安装成功。
但ps和sbas处理时会用到contrib文件夹下的timeseries和stack两个包,在线安装是没有的,因此存在安装教程中还离线下载包并配置这另个环境的原因。按照

export ISCE_STACK=/home/serena/isce2

export prepStackToStaMPS=/home/serena/isce2/contrib/timeseries/prepStackToStaMPS

export PATH=$prepStackToStaMPS/bin:/home/serena/isce2/contrib/stack/topsStack:$PATH

配置环境后会存在提示找不到文件的情况,可能需要增加配置

export PYTHONPATH="/home/yzm/isce2/contrib/stack:$PYTHONPATH"

export PYTHONPATH="/home/yzm/isce2/contrib/timeseries:$PYTHONPATH"



四安装matlab
由于stamps的运行环境为matlab,因此需要优先安装,可以参考的教程为:
https://blog.csdn.net/weixin_43713224/article/details/117548355
需要环境配置中添加alias matlab=“/usr/local/Polyspace/R2020a/bin/matlab”,用于 命令窗口matlab启动程序。

五安装stamps
参考教程如下:https://zhuanlan.zhihu.com/p/53564322
需要注意的是,这个环境变量配置在stamps自己的安装包中的StaMPS_CONFIG修改,在系统的环境变量中只添加StaMPS_CONFIG的路径和启动配置,如下:

# stamps#
export STAMPS_HOME=/home/yzm/文档/StaMPS-master
export SNAPHU_HOME=/home/yzm/文档/snaphu-v2.0.4
export TRAIN_HOME=/home/yzm/文档/TRAIN-master
export PATH=$PATH:$STAMPS_HOME/bin:$SNAPHU_HOME/bin:$TRAIN_HOME/bin

source /home/yzm/文档/StaMPS-master/StaMPS_CONFIG.bash

其中snaphu-v2.0.4和TRAIN-master是stamps使用所需的额外包,也一并配置。
参考教程:https://blog.csdn.net/sa_V_ic/article/details/125997556

六数据预备
需要下载哨兵1和轨道文件,哨兵1下载网址如下:
https://search.asf.alaska.edu/#/

下载py脚本,在命令窗口中python ×× 运行该脚本,下载影像。
下载轨道文件,使用程序:

from data_downloader import downloader,parse_urls
from pathlib import Path
import pandas as pd
import datetime as dt

folder_aux = Path('/home/yzm/文档/INSAR/AxuDir')  # 指定aux_cal,辅助数据 的下载文件夹
folder_preorb = Path('/home/yzm/文档/INSAR/Orbits') # 指定aux_poeorb,精密轨道数据 的下载文件夹


def filter_aux_cal_urls(urls, platform='all'):
    '''filter files from urls of aux_cal by platform.
    
    Parameters:
    ----------
    urls : list
        a list contains the urls of aux_cal 
    platform : str
        platform of satellite. should be one of ['S1A', 'S1B','all']  
    '''
    if platform in ['S1A', 'S1B','all']:
        if platform == 'all':
            platform = ['S1A', 'S1B']
        else:
            platform = [platform]
    else:
        raise ValueError("platform must be one of ['S1A', 'S1B','all']")
    
    _urls = [i for i in urls if Path(i).suffix == '.SAFE']
    urls_filter = [i for i in _urls if Path(i).stem[:3] in platform]
    
    return urls_filter
            

def filter_aux_poeorb_urls(urls, date_start, date_end, platform='all'):
    '''filter files from urls of aux_poeorb(precise orbit) by date and platform.
    
    Parameters:
    ----------
    urls : list
        a list contains the urls of aux_cal
    date_start, date_end : str
    	start/end date to filter
    platform : str
        platform of satellite. should be one of ['S1A', 'S1B','all']  
    '''
    if platform in ['S1A', 'S1B', 'all']:
        if platform == 'all':
            platform = ['S1A', 'S1B']
        else:
            platform = [platform]
    else:
        raise ValueError("platform must be one of ['S1A', 'S1B','all']")

    date_start = pd.to_datetime(date_start).date()
    date_end = pd.to_datetime(date_end).date()
    
    _urls = [i for i in urls if Path(i).suffix == '.EOF']
    urls_filter = []
    for i in _urls:
        name = Path(i).stem
        dt_i = (pd.to_datetime(name.split('_')[-1]).date() 
                - dt.timedelta(days=1))
        
        if (name[:3] in platform and 
            date_start <= dt_i <= date_end):
            urls_filter.append(i)
        
    return urls_filter

					# 执行下载 #
# ########### download aux_cal  #####################
home_aux_cal = 'https://s1qc.asf.alaska.edu/aux_cal/'
urls_aux_cal = parse_urls.from_html(home_aux_cal)
urls = filter_aux_cal_urls(urls_aux_cal,'S1A') # 获取S1A的所有辅助数据的链接
downloader.async_download_datas(urls, folder=folder_aux)


########### download precise orbit ############
home_preorb = 'https://s1qc.asf.alaska.edu/aux_poeorb/'
urls_preorb = parse_urls.from_html(home_preorb)
urls = filter_aux_poeorb_urls(urls_preorb, 
                              '20220101', '20221215',
                              'S1A') # 获取所有S1A在20210101-20221215期间的精密轨道数据的链接
downloader.download_datas(urls, folder=folder_preorb)

 

七isce开始处理
先下载对应区域的dem数据,教程如下:
https://blog.csdn.net/weixin_42464154/article/details/120620958?spm=1001.2014.3001.5501,设置asf帐号和密码如下。

machine urs.earthdata.nasa.gov
login ######
password ######

第六步中也需要用到这个配置帐号。
创建文件夹,命令如下:

mkdir DEM
mkdir SLC
mkdir AxuDir
mkdir Orbits
mkdir Process

将下载的哨兵1放入SLC,将轨道文件放入Orbits。
在DEM中下载dem,命令如下:

 cd DEM
  dem.py -a stitch -b 30 31 110 112 -r -s 1 -c
  rm demLat*.dem demLat*.dem.xml demLat*.dem.vrt

isce生成批处理文件命令如下:

cd Process
stackSentinel.py -s ../SLC/ -d ../DEM/demLat_N30_N31_Lon_E110_E112.dem.wgs84 -a ../AuxDir/ -o ../Orbits -b '30.76 30.94 110.87 111.13' -W slc

在Process文件夹下生成了

这就是时序insar处理时的步骤文件,依次运行即可。这里用python脚本批运行。代码如下:

#!/usr/bin/env python3
#适用于isce2.5及以上版本
import os
import time
start_time = time.time()
print('读取文件')
fileList=os.listdir('./run_files')
for i in range(0,len(fileList)):
	for file in fileList:
          
		if i<9:   
			if file[:7] =='run_0{}_'.format(i+1):
				print('*******处理文件:{}********'.format(file))
				run_file=open('./run_files/{}'.format(file))
				for line in run_file:
					print('**运行命令:{}**'.format(line))
					os.system(line)
		else:
			if file[:7] =='run_{}_'.format(i+1):
				print('*******处理文件:{}********'.format(file))
				run_file=open('./run_files/{}'.format(file))
				for line in run_file:
					print('**运行命令:{}**'.format(line))
					os.system(line)
m, s = divmod(time.time()-start_time, 60)
print('使用时间: {:02.0f} mins {:02.1f} secs\n'.format(m, s))
print('*********完成处理********')

 

运行完成后,生成如下文件夹:

其中最后的文件都在merged文件夹中。

接下来生成stamps需要的文件格式,在根目录下创建配置文件input_file,文件内容如下:

对应的文件夹路径按照本地路径修改。

source_data slc_stack
slc_stack_path /home/yzm/文档/INSAR/Process/merged/SLC
slc_stack_reference 20220725
slc_stack_geom_path /home/yzm/文档/INSAR/Process/merged/geom_reference
slc_stack_baseline_path /home/yzm/文档/INSAR/Process/merged/baselines
range_looks 40
azimuth_looks 10
aspect_ratio 4
lambda 0.056
slc_suffix .full
geom_suffix .full

其中slc_stack_reference 为主影像日期。
参考教程如下:https://blog.csdn.net/ZB18810657133/article/details/116271460?spm=1001.2014.3001.5501

在input_file所在路径命令窗口运行命令,make_single_reference_stack_isce,生成如下文件夹:
接下来在make_single_reference_stack_isce命令生成的INSAR_20220602目录下,运行如下命令:

mt_extract_info_isce#在INSAR_20220602路径下命令窗口 运行

sb_find(0.4,48,150)#matlab中运行,生成连接图,三个参数分别为最小相干性、最大的时间基线、最大的空间基线

make_small_baselines_isce#在INSAR_20220602路径下命令窗口 运行,生成SMALL_BASELINES文件夹

mt_prep_isce 0.3 3 2 50 200#在SMALL_BASELINES文件夹中运行,提取所需信息,幅度校正,建立分块,选取初始高相干候选点。(0.6这个值要比ps的高点。山区阈值选择0.3)其中3×2就是PATCH块的个数。

注意mt_prep_isce参数设置依次为:

da_thresh          //幅度离差阈值,一般取值0.4-0.42,小于此幅度离差的选为PS候选点,默认为0.4
rg_patches         //距离向上分块,默认为1
az_patches         //方位向上分块,默认为1
rg_overlap         //距离向上块间重叠像元数,默认50
az_overlap         //方位向上块间重叠像元数,默认200

参考教程如下:

https://blog.csdn.net/ZB18810657133/article/details/120113396
https://www.bilibili.com/video/BV1pm4y1976U?p=3&vd_source=cef0275840744dbd9a65e929713146b2
其中小基线文件夹SMALL_BASELINES,为stamps处理的根目录。八stamps数据处理
在matlab下的SMALL_BASELINES文件夹进行数据处理,分别执行stamps1-5步骤,然后执行ps_merge_patches,合并步骤5中的分块文件夹。再运行stamps6-8,最后matlab中ps_plot(‘v’ ,4)可以显示结果。
参考教程如下:https://blog.csdn.net/ZB18810657133/article/details/119211263

在运行stamps(1,1)等过程中存在报错的情况,说找不到master,原因在于stamps中代码将主影像编写为master,但isce2.5以后,master用reference替代了,因此需要将stamps中对应文件中的代码中查找master,全部替换为reference。按住ctrl,点击报错显示的代码行,进入后在matlab中用查找工具统一替换。


补上一些绘图命令:

matlab运行过程会报错,因此需要安装如下插件:
sudo apt install tcsh
sudo apt-get install gawk
sudo apt-get install libcanberra-gtk-module

sudo apt-get install libgtk2.0-dev
sudo ln -s /usr/lib/x86_64-linux-gnu/gtk-2.0/modules/libcanberra-gtk-module.so /usr/lib/libcanberra-gtk-module.so
1、Ubuntu 18.04/20.04 默认安装了libcanberra-gtk3-module(gtk-3.0+),而Matlab需要调用的是gtk-2.0+的canberra动态链接库;
(实际上gtk-3.0+目录下也有2.0+版本的动态链接库文件,但似乎Matlab并不支持同一路径下的多版本libcanberra-gtk-module.so)

2、linux默认库是从“/usr/lib/”路径下找,而canberra动态链接库位于“/usr/lib/x86_64-linux-gnu/”路径下;


转载:https://blog.csdn.net/weixin_42464154/article/details/128364234
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场