Source code for S1_NRB.ocn
import numpy as np
from osgeo import gdal, osr
from spatialist.ancillary import finder
[docs]
def extract(src, dst, variable):
"""
Extract an OCN product's image variable and write it to a new GeoTIFF file.
Coordinates are extracted from the corresponding latitude and longitude
image variables and the corner coordinates written as ground control
points (GCPs) to the output file.
Parameters
----------
src: str
path to OCN product SAFE folder
dst: str
the name of the GeoTIFF file to write
variable: str
name of the layer to extract from the OCN product, e.g. `owiNrcsCmod`
Returns
-------
"""
ocn_target = finder(target=src, matchlist=['*.nc'])[0]
ras_ocn = gdal.Open(f'NETCDF:{ocn_target}:{variable}')
arr = ras_ocn.ReadAsArray()
lines, samples = arr.shape
driver = gdal.GetDriverByName('GTiff')
ras_out = driver.CreateCopy(dst, ras_ocn)
ras_lat = gdal.Open(f'NETCDF:{ocn_target}:{variable[:3]}Lat')
ras_lon = gdal.Open(f'NETCDF:{ocn_target}:{variable[:3]}Lon')
arr_lat = ras_lat.ReadAsArray()
arr_lon = ras_lon.ReadAsArray()
ras_lat = ras_lon = None
xres = (np.max(arr_lon) - np.min(arr_lon)) / samples
yres = (np.max(arr_lat) - np.min(arr_lat)) / lines
# coordinates are at pixel center
ulx = float(arr_lon[0, 0]) - xres / 2
uly = float(arr_lat[0, 0]) + yres / 2
urx = float(arr_lon[0, -1]) - xres / 2
ury = float(arr_lat[0, -1]) + yres / 2
llx = float(arr_lon[-1, 0]) - xres / 2
lly = float(arr_lat[-1, 0]) + yres / 2
lrx = float(arr_lon[-1, -1]) - xres / 2
lry = float(arr_lat[-1, -1]) + yres / 2
gcps = [gdal.GCP(ulx, uly, 0, 0, 0),
gdal.GCP(urx, ury, 0, samples, 0),
gdal.GCP(lrx, lry, 0, samples, lines),
gdal.GCP(llx, lly, 0, 0, lines)]
crs = osr.SpatialReference()
crs.SetFromUserInput('EPSG:4326')
ras_out.SetGCPs(gcps, crs)
outband = ras_out.GetRasterBand(1)
outband.SetNoDataValue(-999)
outband.WriteArray(arr, 0, 0)
del arr, arr_lat, arr_lon
outband = None
ras_out = None
ras_ocn = None
[docs]
def gapfill(src, dst, md, si):
"""
Fill gaps of an image file using GDAL.
Parameters
----------
src: str
the source image file
dst: str
the destination image file with gaps filled
md: int
the interpolation maximum distance
si: int
the number of smoothing iterations
Returns
-------
See Also
--------
osgeo.gdal.FillNodata
"""
ras = gdal.Open(src)
band = ras.GetRasterBand(1)
driver = gdal.GetDriverByName('GTiff')
out = driver.CreateCopy(dst, ras)
out_band = out.GetRasterBand(1)
arr = band.ReadAsArray()
out_band.WriteArray(arr)
mask = band.GetMaskBand()
result = gdal.FillNodata(out_band, mask, md, si)
out_band = None
out = None
band = None
ras = None