Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add NADCON5 grids #89

Merged
merged 2 commits into from
Dec 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# This is the config file for Travis-ci.org

sudo: required
dist: focal

# Avoid consuming our GitHub LFS quota
git:
Expand Down
27 changes: 27 additions & 0 deletions copyright_and_licenses.csv
Original file line number Diff line number Diff line change
Expand Up @@ -363,5 +363,32 @@ us_noaa_wshpgn.tif,Disclaimed,Public domain,,
us_noaa_wthpgn.tif,Disclaimed,Public domain,,
us_noaa_wvhpgn.tif,Disclaimed,Public domain,,
us_noaa_wyhpgn.tif,Disclaimed,Public domain,,
us_noaa_nadcon5_as62_nad83_1993_as.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_gu63_nad83_1993_guamcnmi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad27_nad83_1986_alaska.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad27_nad83_1986_conus.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1986_nad83_1992_alaska.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1986_nad83_1993_hawaii.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1986_nad83_1993_prvi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1986_nad83_harn_conus.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1992_nad83_2007_alaska.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1993_nad83_1997_prvi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1993_nad83_2002_as.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1993_nad83_2002_guamcnmi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1993_nad83_pa11_hawaii.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_1997_nad83_2002_prvi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_2002_nad83_2007_prvi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_2002_nad83_ma11_guamcnmi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_2002_nad83_pa11_as.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_2007_nad83_2011_alaska.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_2007_nad83_2011_conus.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_2007_nad83_2011_prvi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_fbn_nad83_2007_conus.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_nad83_harn_nad83_fbn_conus.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_ohd_nad83_1986_hawaii.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_pr40_nad83_1986_prvi.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_sg1952_nad83_1986_stgeorge.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_sl1952_nad83_1986_stlawrence.tif,Disclaimed,Public domain,1.13,
us_noaa_nadcon5_sp1952_nad83_1986_stpaul.tif,Disclaimed,Public domain,1.13,
za_cdngi_README.txt,Disclaimed,Public domain,1.8,
za_cdngi_sageoid2010.tif,Chief Directorate: National Geospatial Information (CD:NGI) South Africa,CC-BY-4.0,1.8,
108 changes: 100 additions & 8 deletions grid_tools/check_gtiff_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def get_srs(ds, epsg_code_key, wkt_key, is_first_subds, infos, warnings, errors)
return srs


def validate_horizontal_offset(ds, is_first_subds):
def validate_horizontal_offset(type, ds, is_first_subds):

infos = []
warnings = []
Expand All @@ -88,10 +88,16 @@ def validate_horizontal_offset(ds, is_first_subds):
warnings.append("target_crs found, but not a Geographic CRS")

if ds.RasterCount < 2:
return infos, warnings, ["TYPE=HORIZONTAL_OFFSET should have at least 2 bands"]
return infos, warnings, [f"TYPE={type} should have at least 2 bands"]
if type == "GEOGRAPHIC_3D_OFFSET":
if ds.RasterCount < 3:
return infos, warnings, [f"TYPE={type} should have at least 3 bands"]
if target_crs.GetAxesCount() != 3:
warnings.append("target_crs found, but not a Geographic 3D CRS")

lat_offset_idx = 0
lon_offset_idx = 0
eht_offset_idx = 0
lat_accuracy_idx = 0
lon_accuracy_idx = 0
for i in range(ds.RasterCount):
Expand All @@ -105,6 +111,10 @@ def validate_horizontal_offset(ds, is_first_subds):
if lon_offset_idx > 0:
return infos, warnings, ["At least, 2 bands are tagged with Description = longitude_offset"]
lon_offset_idx = i+1
elif desc == 'ellipsoidal_height_offset':
if eht_offset_idx > 0:
return infos, warnings, ["At least, 3 bands are tagged with Description = ellipsoidal_height_offset"]
eht_offset_idx = i+1
elif desc == 'latitude_offset_accuracy':
lat_accuracy_idx = i+1
elif desc == 'longitude_offset_accuracy':
Expand All @@ -125,6 +135,16 @@ def validate_horizontal_offset(ds, is_first_subds):
lat_offset_idx = 1
lon_offset_idx = 2

if type == "GEOGRAPHIC_3D_OFFSET":
if eht_offset_idx == 0:
return infos, warnings, ["No band with Description = ellipsoidal_height_offset"]
if eht_offset_idx != 3:
infos.append(
'Usually the 3rd band should be ellipsoidal_height_offset.')
else:
if eht_offset_idx != 0:
return infos, warnings, ["Band with Description = ellipsoidal_height_offset found, but not expected"]

for idx in (lat_offset_idx, lon_offset_idx):
band = ds.GetRasterBand(idx)
if band.GetNoDataValue():
Expand All @@ -149,6 +169,19 @@ def validate_horizontal_offset(ds, is_first_subds):
errors.append("positive_value=%s not supported by PROJ" %
positive_value)

if eht_offset_idx > 0:
band = ds.GetRasterBand(eht_offset_idx)
if band.GetNoDataValue():
warnings.append(
"ellipsoidal_height_offset band has a nodata setting. Nodata for horizontal shift grids is ignored by PROJ")
units = band.GetUnitType()
if not units:
warnings.append(
"ellipsoidal_height_offset band is missing units description. metre will be assumed")
elif units not in ('metre',):
errors.append(
"ellipsoidal_height_offset band is using a unit not supported by PROJ")

if lat_accuracy_idx > 0 and lon_accuracy_idx > 0:
if lat_accuracy_idx != 3 or lon_accuracy_idx != 4:
infos.append(
Expand Down Expand Up @@ -264,6 +297,56 @@ def validate_vertical_offset_vertical_to_vertical(ds, is_first_subds):
return infos, warnings, errors


def validate_ellipsoidal_height_offset(ds, is_first_subds):

infos = []
warnings = []
errors = []

source_crs = ds.GetSpatialRef()
if source_crs:
if not source_crs.IsGeographic():
errors.append("source_crs found, but not a Geographic CRS")

target_crs = get_srs(ds, 'target_crs_epsg_code', 'target_crs_wkt',
is_first_subds, infos, warnings, errors)
if target_crs:
if not target_crs.IsGeographic():
errors.append("target_crs found, but not a Geographic CRS")

offset_idx = 0
for i in range(ds.RasterCount):
b = ds.GetRasterBand(i+1)
desc = b.GetDescription()
if desc == 'ellipsoidal_height_offset':
if offset_idx > 0:
return infos, warnings, ["At least, 2 bands are tagged with Description = ellipsoidal_height_offset"]
offset_idx = i+1
elif desc:
infos.append('Band of type %s not recognized by PROJ' % desc)

if offset_idx == 0:
if is_first_subds:
warnings.append(
'No explicit band tagged with Description = ellipsoidal_height_offset. Assuming first one')
offset_idx = 1

if offset_idx != 1:
infos.append(
'Usually the first band should be ellipsoidal_height_offset.')

units = ds.GetRasterBand(offset_idx).GetUnitType()
if not units:
if is_first_subds:
warnings.append(
"ellipsoidal_height_offset band is missing units description. Metre will be assumed")
elif units not in ('metre', ):
errors.append(
"ellipsoidal_height_offset band is using a unit not supported by PROJ")

return infos, warnings, errors


def validate_geocentric_translation(ds, is_first_subds):

infos = []
Expand Down Expand Up @@ -408,7 +491,7 @@ def validate_defmodel(ds, is_first_subds, first_subds):
'HORIZONTAL',
'VERTICAL',
'3D'):
warnings.append("DISPLACEMENT_TYPE=%s is not recognize by PROJ" % displacement_type)
warnings.append("DISPLACEMENT_TYPE=%s is not recognized by PROJ" % displacement_type)

uncertainty_type = ds.GetMetadataItem('UNCERTAINTY_TYPE')
if not displacement_type:
Expand All @@ -420,7 +503,7 @@ def validate_defmodel(ds, is_first_subds, first_subds):
'HORIZONTAL',
'VERTICAL',
'3D'):
warnings.append("UNCERTAINTY_TYPE=%s is not recognize by PROJ" % uncertainty_type)
warnings.append("UNCERTAINTY_TYPE=%s is not recognized by PROJ" % uncertainty_type)

if displacement_type == 'HORIZONTAL':
min_expected_band_count = 2
Expand Down Expand Up @@ -577,10 +660,12 @@ def validate_ifd(global_info, ds, is_first_subds, first_subds):
elif type not in ('HORIZONTAL_OFFSET',
'VERTICAL_OFFSET_GEOGRAPHIC_TO_VERTICAL',
'VERTICAL_OFFSET_VERTICAL_TO_VERTICAL',
'GEOGRAPHIC_3D_OFFSET',
'ELLIPSOIDAL_HEIGHT_OFFSET',
'GEOCENTRIC_TRANSLATION',
'VELOCITY',
'DEFORMATION_MODEL',):
warnings.append("TYPE=%s is not recognize by PROJ" % type)
warnings.append("TYPE=%s is not recognized by PROJ" % type)

if is_first_subds:
if not ds.GetMetadataItem('area_of_use'):
Expand Down Expand Up @@ -627,8 +712,8 @@ def validate_ifd(global_info, ds, is_first_subds, first_subds):
warnings.append(
'Image uses %s compression. Might cause compatibility problems' % compression)

if type == 'HORIZONTAL_OFFSET':
i, w, e = validate_horizontal_offset(ds, is_first_subds)
if type in ('HORIZONTAL_OFFSET', 'GEOGRAPHIC_3D_OFFSET'):
i, w, e = validate_horizontal_offset(type, ds, is_first_subds)
infos += i
warnings += w
errors += e
Expand Down Expand Up @@ -659,6 +744,11 @@ def validate_ifd(global_info, ds, is_first_subds, first_subds):
infos += i
warnings += w
errors += e
elif type == 'ELLIPSOIDAL_HEIGHT_OFFSET':
i, w, e = validate_ellipsoidal_height_offset(ds, is_first_subds)
infos += i
warnings += w
errors += e

grid_name = ds.GetMetadataItem('grid_name')
if grid_name:
Expand Down Expand Up @@ -707,7 +797,9 @@ def validate_ifd(global_info, ds, is_first_subds, first_subds):
'number_of_nested_grids',
'UNCERTAINTY_TYPE',
'DISPLACEMENT_TYPE',
'UNCERTAINTY_TYPE',):
'UNCERTAINTY_TYPE',
'interpolation_method',
'auxiliary_data',):
infos.append('Metadata %s=%s ignored' % (key, md[key]))

for i in range(ds.RasterCount):
Expand Down
27 changes: 27 additions & 0 deletions travis/expected_main.lst
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,33 @@ us_noaa_mihpgn.tif
us_noaa_mnhpgn.tif
us_noaa_mohpgn.tif
us_noaa_mshpgn.tif
us_noaa_nadcon5_as62_nad83_1993_as.tif
us_noaa_nadcon5_gu63_nad83_1993_guamcnmi.tif
us_noaa_nadcon5_nad27_nad83_1986_alaska.tif
us_noaa_nadcon5_nad27_nad83_1986_conus.tif
us_noaa_nadcon5_nad83_1986_nad83_1992_alaska.tif
us_noaa_nadcon5_nad83_1986_nad83_1993_hawaii.tif
us_noaa_nadcon5_nad83_1986_nad83_1993_prvi.tif
us_noaa_nadcon5_nad83_1986_nad83_harn_conus.tif
us_noaa_nadcon5_nad83_1992_nad83_2007_alaska.tif
us_noaa_nadcon5_nad83_1993_nad83_1997_prvi.tif
us_noaa_nadcon5_nad83_1993_nad83_2002_as.tif
us_noaa_nadcon5_nad83_1993_nad83_2002_guamcnmi.tif
us_noaa_nadcon5_nad83_1993_nad83_pa11_hawaii.tif
us_noaa_nadcon5_nad83_1997_nad83_2002_prvi.tif
us_noaa_nadcon5_nad83_2002_nad83_2007_prvi.tif
us_noaa_nadcon5_nad83_2002_nad83_ma11_guamcnmi.tif
us_noaa_nadcon5_nad83_2002_nad83_pa11_as.tif
us_noaa_nadcon5_nad83_2007_nad83_2011_alaska.tif
us_noaa_nadcon5_nad83_2007_nad83_2011_conus.tif
us_noaa_nadcon5_nad83_2007_nad83_2011_prvi.tif
us_noaa_nadcon5_nad83_fbn_nad83_2007_conus.tif
us_noaa_nadcon5_nad83_harn_nad83_fbn_conus.tif
us_noaa_nadcon5_ohd_nad83_1986_hawaii.tif
us_noaa_nadcon5_pr40_nad83_1986_prvi.tif
us_noaa_nadcon5_sg1952_nad83_1986_stgeorge.tif
us_noaa_nadcon5_sl1952_nad83_1986_stlawrence.tif
us_noaa_nadcon5_sp1952_nad83_1986_stpaul.tif
us_noaa_nbhpgn.tif
us_noaa_nchpgn.tif
us_noaa_ndhpgn.tif
Expand Down
Loading