---
# System prepended metadata

title: Timeseries visualisation_MintPy SBAS
tags: [InSAR, visualisation, earth]

---

## Plot timeseries of selected points

### Extract points (lon lat year.decimals disp) from h5 file
This Python script can batch-extract displacements of point of interest from ==timeseries.h5== or equivalent files, which are acquired by running `smallbaselineApp.py` in MintPy. The extracted displacements are saved into TXT files.

#### python `extract_points_timeseries.py` points.txt
```python=
import os
import datetime
import numpy as np
import sys
from mintpy.utils import utils as ut, plot as pp

# Work directory
proj_dir = os.path.expanduser('.')
ts_file = os.path.join(proj_dir, 'geo/geo_timeseries_SET_ERA5_ramp_demErr.h5')

# Define input files
geom_file = None

def read_coordinates_from_file(file_path, comment_char='>'):
    with open(file_path, 'r') as file:
        lines = file.readlines()
        coordinates = [tuple(map(float, line.strip().split())) for line in lines if not line.startswith(comment_char)]
    return coordinates

def year_fraction(date):
    start = datetime.date(date.year, 1, 1).toordinal()
    year_length = datetime.date(date.year+1, 1, 1).toordinal() - start
    return date.year + float(date.toordinal() - start) / year_length

def save_displacement_timeseries(lon, lat, dates, dis, geom_file=None, output_txt_file=None):
    # date.time to decimal years
    decimal_years = [year_fraction(dt) for dt in dates]

    # save to txt file
    header = f'Latitude: {lat}\nLongitude: {lon}\nDate\tDisplacement'
    np.savetxt(output_txt_file, np.column_stack((decimal_years, dis)), delimiter='\t', header=header, comments='')
    print(f'Save to file: {output_txt_file}')

if __name__ == "__main__":
    # Check if the correct number of command-line arguments is provided
    if len(sys.argv) != 2:
        print("Usage: python3 my_script.py input_file.txt")
        sys.exit(1)

    # Read coordinates from the file
    input_file_path = sys.argv[1]
    coordinates = read_coordinates_from_file(input_file_path, comment_char='>')

    # Process all coordinates
    for lon, lat in coordinates:
        # Read dates and displacement for each coordinate
        print(f'Reading from file: {ts_file}')
        dates, dis, _ = ut.read_timeseries_lalo(lat=lat, lon=lon, ts_file=ts_file, lookup_file=geom_file)

        # Generate output file path based on coordinates
        output_txt_file = f'dis_ts_{lat}_{lon}.txt'
        # Save displacement time series to a file
        save_displacement_timeseries(lon, lat, dates, dis, geom_file, output_txt_file)

```
:::info
**How to choose points?**
* Use google earth to check where there are DS or PS, and save location as .kml
* ```gmt kml2gmt save_loc.kml  -Fs -V > points.txt```
:::
points.txt:
```txt
> -L"save_loc"
120.190049476	22.9785584616
> -L"save_loc"
120.250357711	23.1872723963
> -L"save_loc"
120.455205647	23.4795257293
```
:::warning
Notice 
* lon lat order
* Some points may not have LOS velues, so please check the $2 of the output files. Delet files by the script below.
:::

**You will get files as follows**
```txt
Latitude: 21.61
Longitude: 120.784
Date(decimal years)			Displacement
2.019016438356164372e+03	0.000000000000000000e+00 #reference day
2.019049315068493115e+03	-7.456522434949874878e-04
2.019082191780821859e+03	-6.087546236813068390e-03
2.019115068493150602e+03	1.984291709959506989e-03
2.019147945205479346e+03	-3.782014595344662666e-03
2.019180821917808316e+03	-6.287720520049333572e-03
2.019213698630137060e+03	-8.460001088678836823e-03
2.019246575342465803e+03	-3.643303411081433296e-03
2.019279452054794547e+03	-4.640864208340644836e-03
```
> modified from
> https://nbviewer.org/github/insarlab/MintPy-tutorial/blob/main/applications/plot_dis_ts.ipynb


**Remove files if the displacement potentially have problem: `sh timeseries_check_zero.sh`**
```bash=
#!/bin/bash

# Iterate through all files in the current directory
for file in *.txt; do
    # Check if the second column of the fifth line (can be other lines) in the file is exactly=0
    if [ "$(awk 'NR==5 && $2 == 0' "$file")" ]; then
        # If it is, delete the file
        rm "$file"
        echo "Deleted $file"
    else
        echo "No action taken for $file"
    fi
done
```
---
### GMT plot: Map view and profiles

```shell==
#!/bin/bash

# Set the map region
lon=119.9
LON=120.85
lat=22.78
LAT=23.5

# Set the profile region, year (x) and LOS (y)
profile_xmin=2020
profile_xmax=2022
profile_ymin=-0.1
profile_ymax=0.1

# Color list
colors=("red" "blue" "green" "yellow" "purple" "cyan" "orange")

# input files
ts_files=./dis/dis_ts_*_*.txt

# output files
Filename=map_profile
############################################################################
# Create a GMT script for the map
gmt begin $Filename pdf A+m0.5c
    gmt set MAP_FRAME_TYPE plain
    gmt set MAP_TICK_LENGTH_PRIMARY 0
    gmt set FONT_LABEL 8p
    gmt set FONT_ANNOT_PRIMARY 8p

    # Plot the map
    gmt coast -R"$lon/$LON/$lat/$LAT" -JX10c -Bxaf -Byaf -BwsNE+t"Map" -W0.5p,black

    # Loop over the coordinates and plot the points on the map
    i=0
    for file in $ts_files; do
        # Extract latitude and longitude from the header
        lat=$(awk -F'[:\t]' '/Latitude:/ {print $2}' "$file")
        lon=$(awk -F'[:\t]' '/Longitude:/ {print $2}' "$file")

        # Plot the point on the map
        echo $lon $lat| gmt plot -Sc0.2c -G"${colors[$i]}" -Wblack -N
		#check
        echo $lon $lat
        echo $file
        echo ${colors[$i]}
      	# Increment the color index
        ((i++))
      	# Reset color index if it exceeds the number of colors
        [ $i -eq ${#colors[@]} ] && i=0

    done

    # Plot the profile
profile_R="$profile_xmin/$profile_xmax/$profile_ymin/$profile_ymax"
profile_J=X10c/3c
    # Reset color index for profiles
    i=0

    gmt basemap -Y-4c   -R$profile_R -J$profile_J -Byafg+l"LOS m/yr" -Bxaf+l"Year" -BESnw+t"Time Series Profile"
	
  for file in $ts_files; do
      # Extract latitude and longitude from the header
      lat=$(awk -F'[:\t]' '/Latitude:/ {print $2}' "$file")
      lon=$(awk -F'[:\t]' '/Longitude:/ {print $2}' "$file")

      # Plot the time series profile
      gmt plot "$file" -R$profile_R -J$profile_J   -W0.5p,"${colors[$i]}" -Sc0.1
	  #check
      echo $lon $lat
      echo $file
      echo ${colors[$i]}
 	  # Increment the color index
      ((i++))
      # Reset color index if it exceeds the number of colors
      [ $i -eq ${#colors[@]} ] && i=0
  done

gmt end show

```


### Consider both ascending and descending in one plot

### plot together with GNSS and leveling

