Skip to content

Commit f9e629e

Browse files
committed
debug new epsg questionnaire
1 parent 6383d52 commit f9e629e

File tree

5 files changed

+85
-153
lines changed

5 files changed

+85
-153
lines changed

ost/Project.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,9 @@ def bursts_to_ards(
662662
self.ard_parameters['single_ARD']['dem'][
663663
'dem_name'] = 'Copernicus 30m Global DEM'
664664

665-
if self.ard_parameters['dem']['out_projection'] == 4326:
665+
if self.ard_parameters['single_ARD']['dem'][
666+
'out_projection'
667+
] == 4326:
666668

667669
logger.info(
668670
'The scene\'s location is towards the poles. '
@@ -819,26 +821,38 @@ def grds_to_ards(
819821
# when outside SRTM
820822
center_lat = loads(self.aoi).centroid.y
821823
if float(center_lat) > 59 or float(center_lat) < -59:
822-
logger.info(
823-
'Scene is outside SRTM coverage. Snap will therefore use '
824-
'the GETASSE30 DEM. Also consider to use a stereographic '
825-
'projection. and project to NSIDC Sea Ice Polar '
826-
'Stereographic North projection (EPSG 3413).'
827-
)
828-
epsg = input(
829-
'Please type the EPSG you want to project the output data or '
830-
'just press enter for keeping Lat/Lon coordinate system '
831-
'(e.g. 3413 for NSIDC Sea Ice Polar Stereographic North '
832-
'projection, or 3976 for NSIDC Sea Ice Polar Stereographic '
833-
'South projection'
834-
)
835-
if not epsg:
836-
epsg = 4326
837824

838-
self.ard_parameters['single_ARD']['dem'][
839-
'dem_name'] = 'GETASSE30'
840-
self.ard_parameters['single_ARD']['dem'][
841-
'out_projection'] = int(epsg)
825+
if 'SRTM' in self.ard_parameters['single_ARD']['dem']['dem_name']:
826+
logger.info(
827+
'Scene is outside SRTM coverage. Snap will therefore use '
828+
'the Copernicus 30m Global DEM. '
829+
)
830+
831+
self.ard_parameters['single_ARD']['dem'][
832+
'dem_name'] = 'Copernicus 30m Global DEM'
833+
834+
if self.ard_parameters['single_ARD']['dem'][
835+
'out_projection'
836+
] == 4326:
837+
838+
logger.info(
839+
'The scene\'s location is towards the poles. '
840+
'Consider to use a stereographic projection.'
841+
)
842+
843+
epsg = input(
844+
'Type an alternative EPSG code for the projection of the '
845+
'output data or just press enter for keeping Lat/Lon '
846+
'coordinate system (e.g. 3413 for NSIDC Sea Ice Polar '
847+
'Stereographic North projection, or 3976 for '
848+
'NSIDC Sea Ice Polar Stereographic South projection'
849+
)
850+
851+
if not epsg:
852+
epsg = 4326
853+
854+
self.ard_parameters['single_ARD']['dem'][
855+
'out_projection'] = int(epsg)
842856

843857
# --------------------------------------------
844858
# 3 subset determination

ost/generic/ts_ls_mask.py

Lines changed: 30 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -5,122 +5,23 @@
55
import shutil
66
import logging
77
from pathlib import Path
8-
from tempfile import TemporaryDirectory
98

10-
import rasterio
11-
import numpy as np
129
import geopandas as gpd
1310
from shapely.ops import unary_union
1411
from retrying import retry
1512

1613
try:
1714
import gdal
1815
except ModuleNotFoundError as e:
19-
from osgeo import gdal
20-
except ModuleNotFoundError as e:
21-
raise e
16+
try:
17+
from osgeo import gdal
18+
except ModuleNotFoundError:
19+
raise e
2220

2321
from ost.helpers import raster as ras, vector as vec
2422

2523
logger = logging.getLogger(__name__)
2624

27-
@retry(stop_max_attempt_number=3, wait_fixed=1)
28-
def mt_layover_old(list_of_files, config_file):
29-
"""
30-
31-
:param list_of_files:
32-
:param config_file:
33-
:return:
34-
"""
35-
36-
# this is a godale thing
37-
with open(config_file) as file:
38-
config_dict = json.load(file)
39-
temp_dir = Path(config_dict['temp_dir'])
40-
update_extent = (
41-
config_dict['processing']['time-series_ARD']['apply_ls_mask']
42-
)
43-
44-
target_dir = Path(list_of_files[0]).parent.parent.parent
45-
outfile = target_dir.joinpath(f'{target_dir.name}.ls_mask.tif')
46-
extent = target_dir.joinpath(f'{target_dir.name}.extent.gpkg')
47-
burst_dir = Path(outfile).parent
48-
burst = burst_dir.name
49-
50-
logger.info(
51-
f'Creating common Layover/Shadow mask for track {target_dir.name}.'
52-
)
53-
54-
with TemporaryDirectory(prefix=f'{temp_dir}/') as temp:
55-
56-
# temp to Path object
57-
temp = Path(temp)
58-
59-
# create path to temp file
60-
ls_layer = temp.joinpath(Path(outfile).name)
61-
62-
# create a vrt-stack out of
63-
vrt_options = gdal.BuildVRTOptions(srcNodata=0, separate=True)
64-
gdal.BuildVRT(
65-
str(temp.joinpath('ls.vrt')),
66-
list_of_files,
67-
options=vrt_options
68-
)
69-
70-
with rasterio.open(temp.joinpath('ls.vrt')) as src:
71-
72-
# get metadata
73-
meta = src.meta
74-
# update driver and reduced band count
75-
meta.update(driver='GTiff', count=1, dtype='uint8')
76-
77-
# create outfiles
78-
with rasterio.open(ls_layer, 'w', **meta) as out_min:
79-
80-
# loop through blocks
81-
for _, window in src.block_windows(1):
82-
83-
# read array with all bands
84-
stack = src.read(range(1, src.count + 1), window=window)
85-
86-
# get stats
87-
arr_max = np.nanmax(stack, axis=0)
88-
arr = np.divide(arr_max, arr_max)
89-
90-
out_min.write(np.uint8(arr), window=window, indexes=1)
91-
92-
ras.mask_by_shape(
93-
ls_layer, outfile, extent, to_db=False,
94-
datatype='uint8', rescale=False, ndv=0
95-
)
96-
97-
ls_layer.unlink()
98-
99-
extent_ls_masked = None
100-
if update_extent:
101-
102-
logger.info(
103-
'Calculating symmetrical difference of extent and ls_mask'
104-
)
105-
106-
# polygonize the multi-temporal ls mask
107-
ras.polygonize_raster(outfile, f'{str(outfile)[:-4]}.gpkg')
108-
109-
# create file for masked extent
110-
extent_ls_masked = burst_dir.joinpath(
111-
f'{burst}.extent.masked.gpkg'
112-
)
113-
114-
# calculate difference between burst extent
115-
# and ls mask, for masked extent
116-
try:
117-
vec.difference(
118-
extent, f'{outfile.stem}.gpkg', extent_ls_masked
119-
)
120-
except:
121-
shutil.copy(extent, extent_ls_masked)
122-
123-
return burst_dir, list_of_files, outfile, extent_ls_masked
12425

12526
@retry(stop_max_attempt_number=3, wait_fixed=1)
12627
def mt_layover(list_of_ls):
@@ -137,34 +38,40 @@ def mt_layover(list_of_ls):
13738
f'Creating common Layover/Shadow mask for track {target_dir.name}.'
13839
)
13940

41+
y = 0
14042
for i, file in enumerate(list_of_ls):
14143

142-
if i == 0:
44+
if y == 0:
14345
df1 = gpd.read_file(file)
14446
df1 = df1[~(df1.geometry.is_empty | df1.geometry.isna())]
145-
geom = df1.geometry.buffer(0).unary_union
47+
if len(df1) > 0:
48+
geom = df1.geometry.buffer(0).unary_union
49+
y = 1
14650

147-
if i > 0:
51+
if y > 0:
14852

14953
df2 = gpd.read_file(file)
15054
df2 = df2[~(df2.geometry.is_empty | df2.geometry.isna())]
15155
geom2 = df2.geometry.buffer(0).unary_union
15256
geom = unary_union([geom, geom2])
15357

154-
# make geometry valid in case it isn't
155-
geom = geom.buffer(0)
156-
157-
# remove slivers
158-
buffer = 0.00001
159-
geom = geom.buffer(
160-
-buffer, 1, join_style=2
161-
).buffer(
162-
buffer, 1, cap_style=1, join_style=2
163-
).__geo_interface__
164-
165-
# write to output
166-
with open(outfile, 'w') as file:
167-
json.dump(geom, file)
168-
169-
# create difference file for valid data shape
170-
vec.difference(bounds, outfile, valid_file)
58+
if y > 0:
59+
# make geometry valid in case it isn't
60+
geom = geom.buffer(0)
61+
62+
# remove slivers
63+
buffer = 0.00001
64+
geom = geom.buffer(
65+
-buffer, 1, join_style=2
66+
).buffer(
67+
buffer, 1, cap_style=1, join_style=2
68+
).__geo_interface__
69+
70+
# write to output
71+
with open(outfile, 'w') as file:
72+
json.dump(geom, file)
73+
74+
# create difference file for valid data shape
75+
vec.difference(bounds, outfile, valid_file)
76+
else:
77+
shutil.copy(bounds, valid_file)

ost/helpers/vector.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
try:
1313
import ogr
1414
except ModuleNotFoundError as e:
15-
from osgeo import ogr
16-
except ModuleNotFoundError as e:
17-
raise e
15+
try:
16+
from osgeo import ogr
17+
except ModuleNotFoundError:
18+
raise e
1819

1920
from shapely.ops import transform
2021
from shapely.wkt import loads
@@ -61,9 +62,9 @@ def aoi_to_wkt(aoi):
6162
if Path(aoi).exists():
6263
try:
6364
gdf = gpd.GeoDataFrame.from_file(aoi)
64-
if gdf.crs != {'epsg:4326'}:
65+
if gdf.crs != 'epsg:4326':
6566
try:
66-
gdf = gdf.geometry.to_crs({'epsg:4326'})
67+
gdf = gdf.geometry.to_crs('epsg:4326')
6768
except:
6869
raise ValueError('No valid OST AOI definition.')
6970
# return AOI as single vector object
@@ -339,8 +340,6 @@ def wkt_to_gdf(wkt):
339340
:return:
340341
"""
341342

342-
warnings.filterwarnings('ignore', r'syntax is deprecated', FutureWarning)
343-
344343
# load wkt
345344
geometry = loads(wkt)
346345

@@ -427,6 +426,11 @@ def exterior(infile, outfile, buffer=None):
427426

428427
def difference(infile1, infile2, outfile):
429428

429+
import warnings
430+
warnings.filterwarnings(
431+
'ignore', 'Geometry is in a geographic CRS', UserWarning
432+
)
433+
430434
gdf1 = gpd.read_file(infile1)
431435
gdf2 = gpd.read_file(infile2)
432436

ost/s1/refine_inventory.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,9 +490,14 @@ def search_refinement(
490490
491491
"""
492492

493-
# creat AOI GeoDataframe and calulate area
493+
warnings.filterwarnings(
494+
'ignore', 'Geometry is in a geographic CRS', UserWarning
495+
)
496+
497+
# create AOI GeoDataframe and calulate area
494498
aoi_gdf = vec.wkt_to_gdf(aoi)
495499
aoi_area = aoi_gdf.area.sum()
500+
496501
# get all polarisations apparent in the inventory
497502
pols = inventory_df['polarisationmode'].unique()
498503

ost/s1/s1scene.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ def set_external_dem(self, dem_file, ellipsoid_correction=True):
717717
import rasterio
718718

719719
# check if file exists
720-
if not Path(dem_file).eixtst():
720+
if not Path(dem_file).exists():
721721
raise FileNotFoundError(f'No file found at {dem_file}.')
722722

723723
# get no data value
@@ -799,7 +799,9 @@ def create_ard(self, infile, out_dir, subset=None, overwrite=False):
799799
self.ard_parameters['single_ARD']['dem'][
800800
'dem_name'] = 'Copernicus 30m Global DEM'
801801

802-
if self.ard_parameters['dem']['out_projection'] == 4326:
802+
if self.ard_parameters['single_ARD']['dem'][
803+
'out_projection'
804+
] == 4326:
803805

804806
logger.info(
805807
'The scene\'s location is towards the poles. '

0 commit comments

Comments
 (0)