gdalautotest-3.2.2/0000775000175000017500000000000014020414415012667 5ustar evenevengdalautotest-3.2.2/gdrivers/0000775000175000017500000000000014020414377014523 5ustar evenevengdalautotest-3.2.2/gdrivers/ozi.py0000775000175000017500000000741714020414366015710 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ozi.py 7bedf61bbb8d8c331642b44f30c083abb43f4085 2020-02-05 23:35:17 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: OZI Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Test reading OZF2 file def test_ozi_online_1(): if not gdaltest.download_file('http://www.oziexplorer2.com/maps/Europe2001_setup.exe', 'Europe2001_setup.exe'): pytest.skip() try: os.stat('tmp/cache/Europe 2001_OZF.map') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/Europe2001_setup.exe') try: os.stat('tmp/cache/Europe 2001_OZF.map') except OSError: pytest.skip() except: pytest.skip() ds = gdal.Open('tmp/cache/Europe 2001_OZF.map') assert ds is not None if False: # pylint: disable=using-constant-test gt = ds.GetGeoTransform() wkt = ds.GetProjectionRef() expected_gt = (-1841870.2731215316, 3310.9550245520159, -13.025246304875619, 8375316.4662204208, -16.912440131236657, -3264.1162527118681) for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-7), 'bad geotransform' else: gcps = ds.GetGCPs() assert len(gcps) == 4, 'did not get expected gcp count.' gcp0 = gcps[0] assert gcp0.GCPPixel == 61 and gcp0.GCPLine == 436 and gcp0.GCPX == pytest.approx(-1653990.4525324, abs=0.001) and gcp0.GCPY == pytest.approx(6950885.0402214, abs=0.001), \ 'did not get expected gcp.' wkt = ds.GetGCPProjection() expected_wkt = 'PROJCS["unnamed",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",4],PARAMETER["central_meridian",10],PARAMETER["standard_parallel_1",40],PARAMETER["standard_parallel_2",56],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' assert wkt == expected_wkt, wkt cs = ds.GetRasterBand(1).Checksum() assert cs == 16025, 'bad checksum' gdalautotest-3.2.2/gdrivers/byn.py0000775000175000017500000000433314020414366015671 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: byn.py d37d28371ba8f020424b060c92c3f682ee89404b 2020-05-10 15:11:57 +0200 Even Rouault $ # # Project: National Resources Canada - Vertical Datum Transformation # Purpose: Test read/write functionality for BYN driver. # Author: Ivan Lucena, ivan.lucena@outlook.com # ############################################################################### # Copyright (c) 2018, Ivan Lucena # Copyright (c) 2018, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Read test of byte file. def test_byn_1(): tst = gdaltest.GDALTest('BYN', 'byn/cgg2013ai08_reduced.byn', 1, 64764) return tst.testOpen() ############################################################################### # def test_byn_2(): tst = gdaltest.GDALTest('BYN', 'byn/cgg2013ai08_reduced.byn', 1, 64764) return tst.testCreateCopy(new_filename='tmp/byn_test_2.byn') ############################################################################### # gdalautotest-3.2.2/gdrivers/vrtwarp.py0000775000175000017500000004063014020414366016606 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: vrtwarp.py 3ea1cb89d5dccaea43fecf7aa9aee474abd27f8a 2020-05-10 16:21:22 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test VRTWarpedDataset support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil import sys from osgeo import gdal import gdaltest import pytest ############################################################################### # Verify reading from simple existing warp definition. def test_vrtwarp_1(): tst = gdaltest.GDALTest('VRT', 'vrt/rgb_warp.vrt', 2, 21504) return tst.testOpen(check_filelist=False) ############################################################################### # Create a new VRT warp in the temp directory. def test_vrtwarp_2(): try: os.remove('tmp/warp.vrt') except OSError: pass gcp_ds = gdal.OpenShared('data/rgb_gcp.vrt', gdal.GA_ReadOnly) gdaltest.vrtwarp_ds = gdal.AutoCreateWarpedVRT(gcp_ds) gcp_ds = None checksum = gdaltest.vrtwarp_ds.GetRasterBand(2).Checksum() expected = 21504 assert checksum == expected, ('Got checksum of %d instead of expected %d.' % (checksum, expected)) ############################################################################### # Force the VRT warp file to be written to disk and close it. Reopen, and # verify checksum. def test_vrtwarp_3(): gdaltest.vrtwarp_ds.SetDescription('tmp/warp.vrt') gdaltest.vrtwarp_ds = None gdaltest.vrtwarp_ds = gdal.Open('tmp/warp.vrt', gdal.GA_ReadOnly) checksum = gdaltest.vrtwarp_ds.GetRasterBand(2).Checksum() expected = 21504 gdaltest.vrtwarp_ds = None gdal.GetDriverByName('VRT').Delete('tmp/warp.vrt') assert checksum == expected, ('Got checksum of %d instead of expected %d.' % (checksum, expected)) ############################################################################### # Test implicit overviews with default source overview level strategy (AUTO) def test_vrtwarp_4(): src_ds = gdal.Open('../gcore/data/byte.tif') tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_4.tif', src_ds) cs_main = tmp_ds.GetRasterBand(1).Checksum() tmp_ds.BuildOverviews('NONE', overviewlist=[2, 4]) tmp_ds.GetRasterBand(1).GetOverview(0).Fill(127) cs_ov0 = tmp_ds.GetRasterBand(1).GetOverview(0).Checksum() tmp_ds.GetRasterBand(1).GetOverview(1).Fill(255) cs_ov1 = tmp_ds.GetRasterBand(1).GetOverview(1).Checksum() vrtwarp_ds = gdal.AutoCreateWarpedVRT(tmp_ds) tmp_ds = None for i in range(3): assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 2 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main, i assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == cs_ov0 assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == cs_ov1 if i == 0: vrtwarp_ds.SetDescription('tmp/vrtwarp_4.vrt') vrtwarp_ds = None vrtwarp_ds = gdal.Open('tmp/vrtwarp_4.vrt') elif i == 1: vrtwarp_ds = None tmp_ds = gdal.Open('tmp/vrtwarp_4.tif') vrtwarp_ds = gdal.AutoCreateWarpedVRT(tmp_ds) vrtwarp_ds.SetMetadataItem('SrcOvrLevel', 'AUTO') vrtwarp_ds.SetDescription('tmp/vrtwarp_4.vrt') tmp_ds = None # Add an explicit overview vrtwarp_ds.BuildOverviews('NEAR', overviewlist=[2, 4, 8]) vrtwarp_ds = None ds = gdal.GetDriverByName('MEM').Create('', 3, 3, 1) ds.GetRasterBand(1).Fill(255) expected_cs_ov2 = ds.GetRasterBand(1).Checksum() ds = None vrtwarp_ds = gdal.Open('tmp/vrtwarp_4.vrt') assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 3 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == cs_ov0 assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == cs_ov1 assert vrtwarp_ds.GetRasterBand(1).GetOverview(2).Checksum() == expected_cs_ov2 vrtwarp_ds = None gdal.Unlink('tmp/vrtwarp_4.vrt') gdal.Unlink('tmp/vrtwarp_4.tif') ############################################################################### # Test implicit overviews with selection of the upper source overview level def test_vrtwarp_5(): src_ds = gdal.Open('../gcore/data/byte.tif') tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_5.tif', src_ds) cs_main = tmp_ds.GetRasterBand(1).Checksum() tmp_ds.BuildOverviews('NONE', overviewlist=[2, 4]) tmp_ds.GetRasterBand(1).GetOverview(0).Fill(127) tmp_ds.GetRasterBand(1).GetOverview(0).Checksum() tmp_ds.GetRasterBand(1).GetOverview(1).Fill(255) tmp_ds.GetRasterBand(1).GetOverview(1).Checksum() tmp_ds = None ds = gdal.Warp('', 'tmp/vrtwarp_5.tif', options='-of MEM -ovr NONE -overwrite -ts 10 10') expected_cs_ov0 = ds.GetRasterBand(1).Checksum() ds = None ds = gdal.GetDriverByName('MEM').Create('', 5, 5, 1) ds.GetRasterBand(1).Fill(127) expected_cs_ov1 = ds.GetRasterBand(1).Checksum() ds = None tmp_ds = gdal.Open('tmp/vrtwarp_5.tif') vrtwarp_ds = gdal.AutoCreateWarpedVRT(tmp_ds) vrtwarp_ds.SetMetadataItem('SrcOvrLevel', 'AUTO-1') tmp_ds = None assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 2 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == expected_cs_ov0 assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == expected_cs_ov1 vrtwarp_ds = None gdal.Unlink('tmp/vrtwarp_5.tif') ############################################################################### # Test implicit overviews with GCP def test_vrtwarp_6(): src_ds = gdal.Open('../gcore/data/byte.tif') tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_6.tif', src_ds) cs_main = tmp_ds.GetRasterBand(1).Checksum() tmp_ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) # cancel geotransform gcp1 = gdal.GCP() gcp1.GCPPixel = 0 gcp1.GCPLine = 0 gcp1.GCPX = 440720.000 gcp1.GCPY = 3751320.000 gcp2 = gdal.GCP() gcp2.GCPPixel = 0 gcp2.GCPLine = 20 gcp2.GCPX = 440720.000 gcp2.GCPY = 3750120.000 gcp3 = gdal.GCP() gcp3.GCPPixel = 20 gcp3.GCPLine = 0 gcp3.GCPX = 441920.000 gcp3.GCPY = 3751320.000 src_gcps = (gcp1, gcp2, gcp3) tmp_ds.SetGCPs(src_gcps, src_ds.GetProjectionRef()) tmp_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) cs_ov0 = tmp_ds.GetRasterBand(1).GetOverview(0).Checksum() cs_ov1 = tmp_ds.GetRasterBand(1).GetOverview(1).Checksum() vrtwarp_ds = gdal.AutoCreateWarpedVRT(tmp_ds) vrtwarp_ds.SetDescription('tmp/vrtwarp_6.vrt') vrtwarp_ds = None tmp_ds = None vrtwarp_ds = gdal.Open('tmp/vrtwarp_6.vrt') assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 2 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == cs_ov0 assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == cs_ov1 gdal.Unlink('tmp/vrtwarp_6.vrt') gdal.Unlink('tmp/vrtwarp_6.tif') ############################################################################### # Test implicit overviews with GCP (TPS) def test_vrtwarp_7(): src_ds = gdal.Open('../gcore/data/byte.tif') tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_7.tif', src_ds) cs_main = tmp_ds.GetRasterBand(1).Checksum() tmp_ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) # cancel geotransform gcp1 = gdal.GCP() gcp1.GCPPixel = 0 gcp1.GCPLine = 0 gcp1.GCPX = 440720.000 gcp1.GCPY = 3751320.000 gcp2 = gdal.GCP() gcp2.GCPPixel = 0 gcp2.GCPLine = 20 gcp2.GCPX = 440720.000 gcp2.GCPY = 3750120.000 gcp3 = gdal.GCP() gcp3.GCPPixel = 20 gcp3.GCPLine = 0 gcp3.GCPX = 441920.000 gcp3.GCPY = 3751320.000 src_gcps = (gcp1, gcp2, gcp3) tmp_ds.SetGCPs(src_gcps, src_ds.GetProjectionRef()) tmp_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) cs_ov0 = tmp_ds.GetRasterBand(1).GetOverview(0).Checksum() cs_ov1 = tmp_ds.GetRasterBand(1).GetOverview(1).Checksum() tmp_ds = None vrtwarp_ds = gdal.Warp('tmp/vrtwarp_7.vrt', 'tmp/vrtwarp_7.tif', options='-overwrite -of VRT -tps') assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 2 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == cs_ov0 assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == cs_ov1 vrtwarp_ds = None gdal.Unlink('tmp/vrtwarp_7.vrt') gdal.Unlink('tmp/vrtwarp_7.tif') ############################################################################### # Test implicit overviews with RPC def test_vrtwarp_8(): shutil.copy('../gcore/data/byte.tif', 'tmp/vrtwarp_8.tif') shutil.copy('../gcore/data/test_rpc.txt', 'tmp/vrtwarp_8_rpc.txt') ds = gdal.Open('tmp/vrtwarp_8.tif', gdal.GA_Update) ds.BuildOverviews('NEAR', overviewlist=[2]) ds = None ds = gdal.Warp('', 'tmp/vrtwarp_8.tif', options='-of MEM -rpc') expected_cs_main = ds.GetRasterBand(1).Checksum() ds = None vrtwarp_ds = gdal.Warp('tmp/vrtwarp_8.vrt', 'tmp/vrtwarp_8.tif', options='-overwrite -of VRT -rpc') assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 1 assert vrtwarp_ds.GetRasterBand(1).Checksum() == expected_cs_main if vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() != 1214: print(vrtwarp_ds.GetRasterBand(1).GetOverview(0).XSize) pytest.fail(vrtwarp_ds.GetRasterBand(1).GetOverview(0).YSize) vrtwarp_ds = None gdal.Unlink('tmp/vrtwarp_8.vrt') gdal.Unlink('tmp/vrtwarp_8.tif') gdal.Unlink('tmp/vrtwarp_8_rpc.txt') ############################################################################### # Test implicit overviews with GEOLOCATION def test_vrtwarp_9(): shutil.copy('../gcore/data/sstgeo.tif', 'tmp/sstgeo.tif') f = open('tmp/sstgeo.vrt', 'wb') f.write(''' GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]] tmp/sstgeo.tif 1 0 1 tmp/sstgeo.tif 2 0 1 Gray -32767 sstgeo.tif 3 '''.encode('ascii')) f.close() ds = gdal.Open('tmp/sstgeo.vrt', gdal.GA_Update) ds.BuildOverviews('NEAR', overviewlist=[2]) ds = None ds = gdal.Warp('', 'tmp/sstgeo.vrt', options='-of MEM -geoloc') expected_cs_main = ds.GetRasterBand(1).Checksum() ds = None vrtwarp_ds = gdal.Warp('tmp/vrtwarp_9.vrt', 'tmp/sstgeo.vrt', options='-overwrite -of VRT -geoloc') assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 1 assert vrtwarp_ds.GetRasterBand(1).Checksum() == expected_cs_main if vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() != 63859: print(vrtwarp_ds.GetRasterBand(1).GetOverview(0).XSize) pytest.fail(vrtwarp_ds.GetRasterBand(1).GetOverview(0).YSize) vrtwarp_ds = None gdal.Unlink('tmp/vrtwarp_9.vrt') gdal.Unlink('tmp/sstgeo.vrt') gdal.Unlink('tmp/sstgeo.vrt.ovr') gdal.Unlink('tmp/sstgeo.tif') ############################################################################### # Test implicit overviews with selection of the full resolution level def test_vrtwarp_10(): src_ds = gdal.Open('../gcore/data/byte.tif') tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vrtwarp_10.tif', src_ds) cs_main = tmp_ds.GetRasterBand(1).Checksum() tmp_ds.BuildOverviews('NONE', overviewlist=[2, 4]) tmp_ds.GetRasterBand(1).GetOverview(0).Fill(127) tmp_ds.GetRasterBand(1).GetOverview(0).Checksum() tmp_ds.GetRasterBand(1).GetOverview(1).Fill(255) tmp_ds.GetRasterBand(1).GetOverview(1).Checksum() tmp_ds = None ds = gdal.Warp('', 'tmp/vrtwarp_10.tif', options='-of MEM -ovr NONE -ts 10 10') expected_cs_ov0 = ds.GetRasterBand(1).Checksum() ds = None ds = gdal.Warp('', 'tmp/vrtwarp_10.tif', options='-of MEM -ovr NONE -ts 5 5') expected_cs_ov1 = ds.GetRasterBand(1).Checksum() ds = None tmp_ds = gdal.Open('tmp/vrtwarp_10.tif') vrtwarp_ds = gdal.AutoCreateWarpedVRT(tmp_ds) vrtwarp_ds.SetMetadataItem('SrcOvrLevel', 'NONE') tmp_ds = None assert vrtwarp_ds.GetRasterBand(1).GetOverviewCount() == 2 assert vrtwarp_ds.GetRasterBand(1).Checksum() == cs_main assert vrtwarp_ds.GetRasterBand(1).GetOverview(0).Checksum() == expected_cs_ov0 assert vrtwarp_ds.GetRasterBand(1).GetOverview(1).Checksum() == expected_cs_ov1 vrtwarp_ds = None gdal.Unlink('tmp/vrtwarp_10.tif') ############################################################################### # Test implicit overviews with dest alpha band (#6081) def test_vrtwarp_11(): ds = gdal.Open('data/vrt/bug6581.vrt') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() ds = None assert cs1 == 22122 and cs2 == 56685 and cs3 == 22122 ############################################################################### # Test reading a regular VRT whose source is a warped VRT inlined def test_vrtwarp_read_vrt_of_warped_vrt(): ds = gdal.Open('data/vrt/vrt_of_warped_vrt.vrt') cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 ############################################################################### # Test reading a warped VRT with blocks > 2 gigapixels def test_vrtwarp_read_blocks_larger_than_2_gigapixels(): if not gdaltest.run_slow_tests(): pytest.skip() if sys.maxsize < 2**32: pytest.skip('Test not available on 32 bit') import psutil if psutil.virtual_memory().available < 2 * 50000 * 50000: pytest.skip("Not enough virtual memory available") ds = gdal.Open('data/vrt/test_deflate_2GB.vrt') data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) assert data ref_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) ref_ds.GetRasterBand(1).Fill(127) assert data == ref_ds.ReadRaster() ############################################################################### # Test reading a warped VRT that has blocks pointing to spce. # https://github.com/OSGeo/gdal/issues/1985 def test_vrtwarp_read_blocks_in_space(): ds = gdal.Open('data/vrt/geos_vrtwarp.vrt') assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) gdalautotest-3.2.2/gdrivers/georaster.py0000775000175000017500000003212014020414366017067 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: georaster.py 05c258ce182fe537c6a493ff4f93fa57ed1f0466 2018-12-14 16:11:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: GeoRaster Testing. # Author: Ivan Lucena # ############################################################################### # Copyright (c) 2008, Ivan Lucena # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal from osgeo import ogr import gdaltest import pytest pytestmark = [ pytest.mark.skipif('OCI_DSNAME' not in os.environ, reason='no OCI_DSNAME in environment'), pytest.mark.require_driver('GeoRaster'), ] ############################################################################### # def get_connection_str(): oci_dsname = os.environ.get('OCI_DSNAME') if oci_dsname is None: # TODO: Spelling - informe? return '' return 'geor:' + oci_dsname.split(':')[1] ############################################################################### # def test_georaster_init(): gdaltest.oci_ds = None gdaltest.georasterDriver = gdal.GetDriverByName('GeoRaster') gdaltest.oci_ds = ogr.Open(os.environ['OCI_DSNAME']) if gdaltest.oci_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') rs = gdaltest.oci_ds.ExecuteSQL('select owner from all_sdo_geor_sysdata') gdal.PopErrorHandler() err_msg = gdal.GetLastErrorMsg() if rs is not None: gdaltest.oci_ds.ReleaseResultSet(rs) rs = None if err_msg != '': gdaltest.oci_ds = None pytest.skip('ALL_SDO_GEOR_SYSDATA inaccessible, ' 'likely georaster unavailable.') ############################################################################### # def test_georaster_byte(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/byte.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1001, sdo_geor.init('GDAL_TEST_RDT',1001))"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_int16(): if gdaltest.oci_ds is None: pytest.skip() get_connection_str() ds_src = gdal.Open('data/int16.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1002, sdo_geor.init('GDAL_TEST_RDT',1002))"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_int32(): if gdaltest.oci_ds is None: pytest.skip() get_connection_str() ds_src = gdal.Open('data/int32.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1003, sdo_geor.init('GDAL_TEST_RDT',1003))"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_rgb_b1(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/rgbsmall.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1004, sdo_geor.init('GDAL_TEST_RDT',1004))", "BLOCKBSIZE=1"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_rgb_b2(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/rgbsmall.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1005, sdo_geor.init('GDAL_TEST_RDT',1005))", "BLOCKBSIZE=2"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_rgb_b3_bsq(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/rgbsmall.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1006, sdo_geor.init('GDAL_TEST_RDT',1006))", "BLOCKBSIZE=3", "INTERLEAVE=BSQ"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_rgb_b3_bip(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/rgbsmall.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1007, sdo_geor.init('GDAL_TEST_RDT',1007))", "BLOCKBSIZE=3", "INTERLEAVE=BIP"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_rgb_b3_bil(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/rgbsmall.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1008, sdo_geor.init('GDAL_TEST_RDT',1008))", "BLOCKBSIZE=3", "INTERLEAVE=BIL"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_byte_deflate(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/byte.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1009, sdo_geor.init('GDAL_TEST_RDT',1009))", "COMPRESS=DEFLATE"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 4672, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_rgb_deflate_b3(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/rgbsmall.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1010, sdo_geor.init('GDAL_TEST_RDT',1010))", "COMPRESS=DEFLATE", "BLOCKBSIZE=3", "INTERLEAVE=PIXEL"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 21212, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_1bit(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/byte.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1011, sdo_geor.init('GDAL_TEST_RDT',1011))", "NBITS=1"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 252, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_2bit(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/byte.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1012, sdo_geor.init('GDAL_TEST_RDT',1012))", "NBITS=2"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 718, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_4bit(): if gdaltest.oci_ds is None: pytest.skip() ds_src = gdal.Open('data/byte.tif') ds = gdaltest.georasterDriver.CreateCopy(get_connection_str() + ',GDAL_TEST,RASTER', ds_src, 1, ["DESCRIPTION=(id number, raster sdo_georaster)", "INSERT=(1013, sdo_geor.init('GDAL_TEST_RDT',1013))", "NBITS=4"]) ds_name = ds.GetDescription() ds = None tst = gdaltest.GDALTest('GeoRaster', ds_name, 1, 2578, filename_absolute=1) return tst.testOpen() ############################################################################### # def test_georaster_cleanup(): if gdaltest.oci_ds is None: pytest.skip() gdaltest.oci_ds.ExecuteSQL('drop table GDAL_TEST') gdaltest.oci_ds.ExecuteSQL('drop table GDAL_TEST_RDT') gdaltest.oci_ds.Destroy() gdaltest.oci_ds = None ############################################################################### # gdalautotest-3.2.2/gdrivers/webp.py0000775000175000017500000001102114020414366016026 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: webp.py 14ed22d81052a84be154c6fbc85461e43e1652a9 2020-10-14 17:05:31 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test WEBP driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2011-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Test if WEBP driver is present def test_webp_1(): gdaltest.webp_drv = gdal.GetDriverByName('WEBP') if gdaltest.webp_drv is None: pytest.skip() ############################################################################### # Open() test def test_webp_2(): if gdaltest.webp_drv is None: pytest.skip() ds = gdal.Open('data/webp/rgbsmall.webp') cs = ds.GetRasterBand(1).Checksum() assert cs == 21464 or cs == 21450 or cs == 21459, \ 'did not get expected checksum on band 1' ############################################################################### # CreateCopy() test def test_webp_3(): if gdaltest.webp_drv is None: pytest.skip() src_ds = gdal.Open('data/rgbsmall.tif') out_ds = gdaltest.webp_drv.CreateCopy('/vsimem/webp_3.webp', src_ds, options=['QUALITY=80']) src_ds = None cs1 = out_ds.GetRasterBand(1).Checksum() out_ds = None gdal.Unlink('/vsimem/webp_3.webp') gdal.Unlink('/vsimem/webp_3.webp.aux.xml') # 21502 is for libwebp 0.3.0 # 21787 is for libwebp 1.0.3 assert cs1 in (21464, 21502, 21695, 21700, 21787) ############################################################################### # CreateCopy() on RGBA def test_webp_4(): if gdaltest.webp_drv is None: pytest.skip() md = gdaltest.webp_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') == -1: pytest.skip() src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') out_ds = gdaltest.webp_drv.CreateCopy('/vsimem/webp_4.webp', src_ds) src_ds = None cs1 = out_ds.GetRasterBand(1).Checksum() cs4 = out_ds.GetRasterBand(4).Checksum() out_ds = None gdal.Unlink('/vsimem/webp_4.webp') # 22849 is for libwebp 0.3.0 # 29229 is for libwebp 1.0.3 assert cs1 in (22001, 22849, 34422, 36652, 36658, 45319, 29229), \ 'did not get expected checksum on band 1' assert cs4 == 10807, 'did not get expected checksum on band 4' ############################################################################### # CreateCopy() on RGBA with lossless compression def test_webp_5(): if gdaltest.webp_drv is None: pytest.skip() md = gdaltest.webp_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') == -1: pytest.skip() src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') out_ds = gdaltest.webp_drv.CreateCopy('/vsimem/webp_5.webp', src_ds, options=['LOSSLESS=YES']) src_ds = None cs1 = out_ds.GetRasterBand(1).Checksum() cs4 = out_ds.GetRasterBand(4).Checksum() out_ds = None gdal.Unlink('/vsimem/webp_5.webp') assert cs1 == 12603 or cs1 == 18536 or cs1 == 14800, \ 'did not get expected checksum on band 1' assert cs4 == 10807, 'did not get expected checksum on band 4' gdalautotest-3.2.2/gdrivers/gsc.py0000775000175000017500000000352414020414366015656 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: gsc.py bc3db5259394bc36aab28221b8135639fe1a0440 2020-05-10 17:47:35 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GSC driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test a fake - and certainly incorrect - GSC dataset def test_gsc_1(): tst = gdaltest.GDALTest('GSC', 'gsc/fakegsc.gsc', 1, 0) return tst.testOpen() gdalautotest-3.2.2/gdrivers/lan.py0000775000175000017500000000407014020414366015651 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: lan.py eae23edee7c5614a8a661bb704d24a62b7e1f386 2020-05-10 17:48:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test LAN driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test reading a - fake - LAN 8 bit dataset def test_lan_1(): tst = gdaltest.GDALTest('LAN', 'lan/fakelan.lan', 1, 10) return tst.testOpen() ############################################################################### # Test reading a - fake - LAN 4 bit dataset def test_lan_2(): tst = gdaltest.GDALTest('LAN', 'lan/fakelan4bit.lan', 1, 10) return tst.testOpen() gdalautotest-3.2.2/gdrivers/vrtrawlink.py0000775000175000017500000002553414020414366017312 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vrtrawlink.py cae6e103b9b14ed6ef8cc43e3d83bd8125c906b8 2020-05-10 11:39:33 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test VRTRawRasterBand support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2010-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest def _xmlsearch(root, nodetype, name): for node in root[2:]: if node[0] == nodetype and node[1] == name: return node ############################################################################### # Verify reading from simple existing raw definition. def test_vrtrawlink_1(): tst = gdaltest.GDALTest('VRT', 'small.vrt', 2, 12816) return tst.testOpen() ############################################################################### # Create a new VRT raw link via the AddBand() method. def test_vrtrawlink_2(): driver = gdal.GetDriverByName("VRT") ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) options = [ 'subClass=VRTRawRasterBand', 'SourceFilename=data/small.raw' ] result = ds.AddBand(gdal.GDT_Byte, options) assert result == gdal.CE_None, 'AddBand() returned error code' band = ds.GetRasterBand(1) chksum = band.Checksum() assert chksum == 12481, 'Wrong checksum' # Force it to be written to disk. ds = None ############################################################################### # Confirm that the newly written file is was saved properly def test_vrtrawlink_3(): gdaltest.rawlink_ds = gdal.Open('tmp/rawlink.vrt', gdal.GA_Update) filelist = gdaltest.rawlink_ds.GetFileList() band = gdaltest.rawlink_ds.GetRasterBand(1) chksum = band.Checksum() assert chksum == 12481, 'Wrong checksum' assert len(filelist) == 2, 'Wrong filelist' ############################################################################### # Add a new band, and we will test if we can write to it. def test_vrtrawlink_4(): # force creation of the file. open('tmp/rawlink.dat', 'w').write(chr(0)) # Add a new band pointing to this bogus file. options = [ 'subClass=VRTRawRasterBand', 'SourceFilename=tmp/rawlink.dat', 'relativeToVRT=0', 'ImageOffset= 100', 'PixelOffset=3', 'LineOffset=93', 'ByteOrder=MSB' ] result = gdaltest.rawlink_ds.AddBand(gdal.GDT_UInt16, options) assert result == gdal.CE_None, 'AddBand() returned error code' # write out some simple data. band_1 = gdaltest.rawlink_ds.GetRasterBand(1) byte_data = band_1.ReadRaster(0, 0, 31, 35) band = gdaltest.rawlink_ds.GetRasterBand(2) band.WriteRaster(0, 0, 31, 35, byte_data, 31, 35, gdal.GDT_Byte) gdaltest.rawlink_ds.FlushCache() # Verify it seems to be right. chksum = band.Checksum() assert chksum == 12481, 'Wrong checksum' band_1 = None band = None # Close and reopen to ensure we are getting data from disk. gdaltest.rawlink_ds = None gdaltest.rawlink_ds = gdal.Open('tmp/rawlink.vrt', gdal.GA_Update) band = gdaltest.rawlink_ds.GetRasterBand(2) chksum = band.Checksum() assert chksum == 12481, 'Wrong checksum' # verify file length. statinfo = os.stat('tmp/rawlink.dat') assert statinfo.st_size == 3354, 'data file is wrong size' ############################################################################### # Add a new band, and check the relativeToVRT property. def test_vrtrawlink_5(): driver = gdal.GetDriverByName("VRT") ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) # Add a new band pointing to this bogus file. options = [ 'subClass=VRTRawRasterBand', 'SourceFilename=rawlink5.dat', 'relativeToVRT=1', 'ImageOffset=100', 'PixelOffset=3', 'LineOffset=93', 'ByteOrder=MSB' ] result = ds.AddBand(gdal.GDT_UInt16, options) assert result == gdal.CE_None, 'AddBand() returned error code' gdaltest.rawlink_ds.FlushCache() # Close and reopen to ensure we are getting data from disk. ds = None xmlstring = open('tmp/rawlink.vrt').read() root = gdal.ParseXMLString(xmlstring) node = _xmlsearch(root, gdal.CXT_Element, 'VRTRasterBand') node = _xmlsearch(node, gdal.CXT_Element, 'SourceFilename') node = _xmlsearch(node, gdal.CXT_Attribute, 'relativeToVRT') assert node is not None and node[2][1] == "1", 'incorrect relativeToVRT value' assert ('100' in xmlstring and \ '3' in xmlstring and \ '93' in xmlstring) ############################################################################### # Add a new band with relativeToVRT=1, and re-open the dataset. def test_vrtrawlink_6(): driver = gdal.GetDriverByName("VRT") ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) # Add a new band pointing to this bogus file. options = [ 'subClass=VRTRawRasterBand', 'SourceFilename=rawlink6.dat', 'relativeToVRT=1', 'ImageOffset=100', 'PixelOffset=3', 'LineOffset=93', 'ByteOrder=MSB' ] result = ds.AddBand(gdal.GDT_UInt16, options) assert result == gdal.CE_None, 'AddBand() returned error code' ds.FlushCache() # Close and reopen to ensure we are getting data from disk. ds = None ds = gdal.Open('tmp/rawlink.vrt') assert ds is not None, 'unable to open the dataset: "tmp/rawlink.vrt"' b = ds.GetRasterBand(1) assert b is not None, 'unable to open the raster band #1' assert os.path.exists('tmp/rawlink6.dat'), \ 'tha raw file is not in the expected location ("tmp/rawlink6.dat")' ############################################################################### # Add a new band with relativeToVRT=1, change directory and re-open the dataset. def test_vrtrawlink_7(): driver = gdal.GetDriverByName("VRT") ds = driver.Create('tmp/rawlink.vrt', 31, 35, 0) # Add a new band pointing to this bogus file. options = [ 'subClass=VRTRawRasterBand', 'SourceFilename=rawlink7.dat', 'relativeToVRT=1', 'ImageOffset=100', 'PixelOffset=3', 'LineOffset=93', 'ByteOrder=MSB' ] result = ds.AddBand(gdal.GDT_UInt16, options) assert result == gdal.CE_None, 'AddBand() returned error code' ds.FlushCache() # Close and reopen to ensure we are getting data from disk. ds = None os.chdir('tmp') try: ds = gdal.Open('rawlink.vrt') assert ds is not None, 'unable to open the dataset: "rawlink.vrt"' b = ds.GetRasterBand(1) assert b is not None, 'unable to open the raster band #1' finally: os.chdir('..') ############################################################################### # Test error case (too much memory allocation) def test_vrtrawlink_8(): for _ in range(2): with gdaltest.error_handler(): ds = gdal.Open(""" data/small.raw 0 200000 1 LSB """) assert not (ds or gdal.GetLastErrorMsg().find('Image file is too small') < 0) ############################################################################### # Test error case (inexisting file) def test_vrtrawlink_9(): with gdaltest.error_handler(): ds = gdal.Open(""" i/do/not/exist """) assert not (ds or gdal.GetLastErrorMsg().find('Unable to open') < 0) ############################################################################### # Test error case (invalid byte order) def test_vrtrawlink_10(): with gdaltest.error_handler(): ds = gdal.Open(""" data/small.raw invalid """) assert not (ds or gdal.GetLastErrorMsg().find('ByteOrder') < 0) ############################################################################### # def test_vrtrawlink_vax_order(): ds = gdal.Open(""" data/vicar/vicar_vax_float32.vic 368 4 16 VAX """) assert ds.GetRasterBand(1).Checksum() == 129 ############################################################################### # Cleanup. def test_vrtrawlink_cleanup(): gdaltest.rawlink_ds = None try: os.remove('tmp/rawlink.vrt') os.remove('tmp/rawlink.dat') os.remove('tmp/rawlink5.dat') os.remove('tmp/rawlink6.dat') os.remove('tmp/rawlink7.dat') except OSError: pass gdalautotest-3.2.2/gdrivers/gif.py0000775000175000017500000001473014020414366015650 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: gif.py e5064648e74852de4723a848811937d7fab48533 2020-05-10 18:05:10 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for GIF driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008-2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Get the GIF driver, and verify a few things about it. def test_gif_1(): gdaltest.gif_drv = gdal.GetDriverByName('GIF') if gdaltest.gif_drv is None: gdaltest.post_reason('GIF driver not found!') return 'false' # Move the BIGGIF driver after the GIF driver. drv = gdal.GetDriverByName('BIGGIF') drv.Deregister() drv.Register() drv_md = gdaltest.gif_drv.GetMetadata() if drv_md['DMD_MIMETYPE'] != 'image/gif': gdaltest.post_reason('mime type is wrong') return 'false' ############################################################################### # Read test of simple byte reference data. def test_gif_2(): tst = gdaltest.GDALTest('GIF', 'gif/bug407.gif', 1, 57921) return tst.testOpen() ############################################################################### # Test lossless copying. def test_gif_3(): tst = gdaltest.GDALTest('GIF', 'gif/bug407.gif', 1, 57921, options=['INTERLACING=NO']) return tst.testCreateCopy() ############################################################################### # Verify the colormap, and nodata setting for test file. def test_gif_4(): ds = gdal.Open('data/gif/bug407.gif') cm = ds.GetRasterBand(1).GetRasterColorTable() assert cm.GetCount() == 16 and cm.GetColorEntry(0) == (255, 255, 255, 255) and cm.GetColorEntry(1) == (255, 255, 208, 255), \ 'Wrong colormap entries' cm = None assert ds.GetRasterBand(1).GetNoDataValue() is None, 'Wrong nodata value.' md = ds.GetRasterBand(1).GetMetadata() assert 'GIF_BACKGROUND' in md and md['GIF_BACKGROUND'] == '0', \ 'background metadata missing.' ############################################################################### # Test creating an in memory copy. def test_gif_5(): tst = gdaltest.GDALTest('GIF', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Verify nodata support def test_gif_6(): src_ds = gdal.Open('../gcore/data/nodata_byte.tif') new_ds = gdaltest.gif_drv.CreateCopy('tmp/nodata_byte.gif', src_ds) if new_ds is None: gdaltest.post_reason('Create copy operation failure') return 'false' bnd = new_ds.GetRasterBand(1) if bnd.Checksum() != 4440: gdaltest.post_reason('Wrong checksum') return 'false' bnd = None new_ds = None src_ds = None new_ds = gdal.Open('tmp/nodata_byte.gif') bnd = new_ds.GetRasterBand(1) if bnd.Checksum() != 4440: gdaltest.post_reason('Wrong checksum') return 'false' # NOTE - mloskot: condition may fail as nodata is a float-point number nodata = bnd.GetNoDataValue() if nodata != 0: gdaltest.post_reason('Got unexpected nodata value.') return 'false' bnd = None new_ds = None gdaltest.gif_drv.Delete('tmp/nodata_byte.gif') ############################################################################### # Confirm reading with the BIGGIF driver. def test_gif_7(): # Move the GIF driver after the BIGGIF driver. drv = gdal.GetDriverByName('GIF') drv.Deregister() drv.Register() tst = gdaltest.GDALTest('BIGGIF', 'gif/bug407.gif', 1, 57921) tst.testOpen() ds = gdal.Open('data/gif/bug407.gif') assert ds is not None assert ds.GetDriver().ShortName == 'BIGGIF' ############################################################################### # Confirm that BIGGIF driver is selected for huge gifs def test_gif_8(): # Move the BIGGIF driver after the GIF driver. drv = gdal.GetDriverByName('BIGGIF') drv.Deregister() drv.Register() ds = gdal.Open('data/gif/fakebig.gif') assert ds is not None assert ds.GetDriver().ShortName == 'BIGGIF' ############################################################################### # Test writing to /vsistdout/ def test_gif_9(): src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('GIF').CreateCopy( '/vsistdout_redirect//vsimem/tmp.gif', src_ds) assert ds.GetRasterBand(1).Checksum() == 0 src_ds = None ds = None ds = gdal.Open('/vsimem/tmp.gif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672 gdal.Unlink('/vsimem/tmp.gif') ############################################################################### # Test interlacing def test_gif_10(): tst = gdaltest.GDALTest('GIF', 'byte.tif', 1, 4672, options=['INTERLACING=YES']) return tst.testCreateCopy(vsimem=1) ############################################################################### # Cleanup. def test_gif_cleanup(): gdaltest.clean_tmp() gdalautotest-3.2.2/gdrivers/eir.py0000775000175000017500000000347014020414366015661 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: eir.py 231c16d22b4bc771d3bb70750e04d56ef71050dc 2020-05-10 15:46:39 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test EIR driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test a fake EIR dataset def test_eir_1(): tst = gdaltest.GDALTest('EIR', 'eir/fakeeir.hdr', 1, 1) return tst.testOpen() gdalautotest-3.2.2/gdrivers/tiledb_write.py0000775000175000017500000002141714020414366017560 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tiledb_write.py 1327e6736f97fc504c86da26b34a8cba9a58a818 2020-06-22 17:44:24 -0500 Norman Barker $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for GeoTIFF format. # Author: TileDB, Inc # ############################################################################### # Copyright (c) 2019, TileDB, Inc # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import pytest import gdaltest @pytest.mark.require_driver('TileDB') @pytest.mark.parametrize( 'mode', ['BAND', 'PIXEL', 'ATTRIBUTES'] ) def test_tiledb_write_complex(mode): gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') src_ds = gdal.Open('../gcore/data/cfloat64.tif') options = [ 'INTERLEAVE=%s' % (mode) ] new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_complex64', src_ds, options=options) meta = new_ds.GetMetadata('IMAGE_STRUCTURE') assert meta['INTERLEAVE'] == mode, 'Didn\'t get expected mode' bnd = new_ds.GetRasterBand(1) assert bnd.Checksum() == 5028, 'Didn\'t get expected checksum on still-open file' bnd = None new_ds = None gdaltest.tiledb_drv.Delete('tmp/tiledb_complex64') @pytest.mark.require_driver('TileDB') @pytest.mark.parametrize( 'mode', ['BAND', 'PIXEL', 'ATTRIBUTES'] ) def test_tiledb_write_custom_blocksize(mode): gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') src_ds = gdal.Open('../gcore/data/utmsmall.tif') options = ['BLOCKXSIZE=32', 'BLOCKYSIZE=32', 'INTERLEAVE=%s' % (mode)] new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_custom', src_ds, options=options) meta = new_ds.GetMetadata('IMAGE_STRUCTURE') assert meta['INTERLEAVE'] == mode, 'Didn\'t get expected mode' bnd = new_ds.GetRasterBand(1) assert bnd.Checksum() == 50054, 'Didn\'t get expected checksum on still-open file' assert bnd.GetBlockSize() == [32, 32] bnd = None new_ds = None gdaltest.tiledb_drv.Delete('tmp/tiledb_custom') @pytest.mark.require_driver('TileDB') @pytest.mark.parametrize( 'mode', ['BAND', 'PIXEL'] ) def test_tiledb_write_update(mode): try: import numpy as np except (ImportError): pytest.skip() gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') options = [ 'INTERLEAVE=%s' % (mode) ] new_ds = gdaltest.tiledb_drv.Create('tmp/tiledb_update', 20, 20, 1, gdal.GDT_Byte, options=options) new_ds.GetRasterBand(1).WriteArray(np.zeros((20, 20))) meta = new_ds.GetMetadata('IMAGE_STRUCTURE') assert meta['INTERLEAVE'] == mode, 'Didn\'t get expected mode' del new_ds update_ds = gdal.Open('tmp/tiledb_update', gdal.GA_Update) update_bnd = update_ds.GetRasterBand(1) # make a partial block write update_bnd.WriteArray(np.ones((10, 10)) * 255) update_bnd = None update_ds = None test_ds = gdal.Open('tmp/tiledb_update') assert test_ds.GetRasterBand(1).Checksum() == 1217, 'Didn\'t get expected checksum on file update' test_ds = None gdaltest.tiledb_drv.Delete('tmp/tiledb_update') @pytest.mark.require_driver('TileDB') @pytest.mark.parametrize( 'mode', ['BAND', 'PIXEL', 'ATTRIBUTES'] ) def test_tiledb_write_rgb(mode): gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') src_ds = gdal.Open('../gcore/data/rgbsmall.tif') options = [ 'INTERLEAVE=%s' % (mode) ] new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_rgb', src_ds, options=options) meta = new_ds.GetMetadata('IMAGE_STRUCTURE') assert meta['INTERLEAVE'] == mode, 'Didn\'t get expected mode' assert new_ds.RasterCount == 3, 'Didn\'t get expected band count' bnd = new_ds.GetRasterBand(2) assert bnd.Checksum() == 21053, 'Didn\'t get expected checksum on still-open file' new_ds = None gdaltest.tiledb_drv.Delete('tmp/tiledb_rgb') @pytest.mark.require_driver('TileDB') @pytest.mark.parametrize( 'mode', ['BAND', 'PIXEL'] ) def test_tiledb_write_attributes(mode): gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') src_ds = gdal.Open('../gcore/data/rgbsmall.tif') w, h, num_bands = src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount # build attribute data in memory gdal.GetDriverByName('GTiff').Create('/vsimem/temp1.tif', w, h, num_bands, gdal.GDT_Int32) gdal.GetDriverByName('GTiff').Create('/vsimem/temp2.tif', w, h, num_bands, gdal.GDT_Float32) options = [ 'TILEDB_ATTRIBUTE=%s' % ('/vsimem/temp1.tif'), 'TILEDB_ATTRIBUTE=%s' % ('/vsimem/temp2.tif'), 'INTERLEAVE=%s' % (mode) ] new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_rgb_atts', src_ds, options=options) assert new_ds is not None assert new_ds.RasterXSize == src_ds.RasterXSize assert new_ds.RasterYSize == src_ds.RasterYSize assert new_ds.RasterCount == src_ds.RasterCount meta = new_ds.GetMetadata('IMAGE_STRUCTURE') assert meta['INTERLEAVE'] == mode, 'Didn\'t get expected mode' new_ds = None # check we can open the attributes with the band as well as the pixel values att1_ds = gdal.OpenEx('tmp/tiledb_rgb_atts', open_options=['TILEDB_ATTRIBUTE=temp1']) att2_ds = gdal.OpenEx('tmp/tiledb_rgb_atts', open_options=['TILEDB_ATTRIBUTE=temp2']) val_ds = gdal.Open('tmp/tiledb_rgb_atts') meta = val_ds.GetMetadata('IMAGE_STRUCTURE') assert 'TILEDB_ATTRIBUTE_1' in meta assert meta['TILEDB_ATTRIBUTE_1'] == 'temp1' assert 'TILEDB_ATTRIBUTE_2' in meta assert meta['TILEDB_ATTRIBUTE_2'] == 'temp2' assert att1_ds is not None assert att2_ds is not None assert val_ds is not None assert att1_ds.GetRasterBand(1).DataType == gdal.GDT_Int32 assert att2_ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert val_ds.RasterCount == src_ds.RasterCount assert val_ds.GetRasterBand(1).DataType == src_ds.GetRasterBand(1).DataType att1_ds = None att2_ds = None val_ds = None gdaltest.tiledb_drv.Delete('tmp/tiledb_rgb_atts') src_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/temp1.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/temp2.tif') @pytest.mark.require_driver('TileDB') @pytest.mark.require_driver('HDF5') def test_tiledb_write_subdatasets(): gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') src_ds = gdal.Open('data/tiledb_input/DeepBlue-SeaWiFS-1.0_L3_20100101_v004-20130604T131317Z.h5') new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/test_sds_array', src_ds, False) assert new_ds is not None new_ds = None src_ds = None src_ds = gdal.Open('TILEDB:"tmp/test_sds_array":viewing_zenith_angle') assert src_ds.GetRasterBand(1).Checksum() == 42472 src_ds = None src_ds = gdal.Open('TILEDB:"tmp/test_sds_array":i_dont_exist') assert not src_ds gdaltest.tiledb_drv.Delete('tmp/test_sds_array') @pytest.mark.require_driver('TileDB') @pytest.mark.parametrize( 'mode', ['BAND', 'PIXEL', 'ATTRIBUTES'] ) def test_tiledb_write_band_meta(mode): gdaltest.tiledb_drv = gdal.GetDriverByName('TileDB') src_ds = gdal.Open('../gcore/data/rgbsmall.tif') options = [ 'INTERLEAVE=%s' % (mode) ] new_ds = gdaltest.tiledb_drv.CreateCopy('tmp/tiledb_meta', src_ds, options=options) meta = new_ds.GetMetadata('IMAGE_STRUCTURE') assert meta['INTERLEAVE'] == mode, 'Didn\'t get expected mode' bnd = new_ds.GetRasterBand(1) bnd.SetMetadataItem('Item', 'Value') bnd = None new_ds = None new_ds = gdal.Open('tmp/tiledb_meta') assert new_ds.GetRasterBand(1).GetMetadataItem('Item') == 'Value' gdaltest.tiledb_drv.Delete('tmp/tiledb_meta') src_ds = None gdalautotest-3.2.2/gdrivers/kea.py0000775000175000017500000005461514020414366015651 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id $ # # Project: GDAL/OGR Test Suite # Purpose: Test KEA driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2014, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal from osgeo import osr import gdaltest import pytest ############################################################################### def test_kea_init(): gdaltest.kea_driver = gdal.GetDriverByName('KEA') ############################################################################### # Test copying a reference sample with CreateCopy() def test_kea_1(): if gdaltest.kea_driver is None: pytest.skip() tst = gdaltest.GDALTest('KEA', 'byte.tif', 1, 4672, options=['IMAGEBLOCKSIZE=15', 'THEMATIC=YES']) return tst.testCreateCopy(check_srs=True, check_gt=1, new_filename='tmp/byte.kea') ############################################################################### # Test CreateCopy() for various data types def test_kea_2(): if gdaltest.kea_driver is None: pytest.skip() src_files = ['byte.tif', 'int16.tif', '../../gcore/data/uint16.tif', '../../gcore/data/int32.tif', '../../gcore/data/uint32.tif', '../../gcore/data/float32.tif', '../../gcore/data/float64.tif'] for src_file in src_files: tst = gdaltest.GDALTest('KEA', src_file, 1, 4672) tst.testCreateCopy(check_minmax=1) ############################################################################### # Test Create() for various data types def test_kea_3(): if gdaltest.kea_driver is None: pytest.skip() src_files = ['byte.tif', 'int16.tif', '../../gcore/data/uint16.tif', '../../gcore/data/int32.tif', '../../gcore/data/uint32.tif', '../../gcore/data/float32.tif', '../../gcore/data/float64.tif'] for src_file in src_files: tst = gdaltest.GDALTest('KEA', src_file, 1, 4672) tst.testCreate(out_bands=1, check_minmax=1) ############################################################################### # Test Create()/CreateCopy() error cases or limit cases def test_kea_4(): if gdaltest.kea_driver is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdaltest.kea_driver.Create("/non_existing_path/non_existing_path", 1, 1) gdal.PopErrorHandler() assert ds is None src_ds = gdaltest.kea_driver.Create('tmp/src.kea', 1, 1, 0) assert src_ds is not None ds = gdaltest.kea_driver.CreateCopy("tmp/out.kea", src_ds) assert ds is not None assert ds.RasterCount == 0 src_ds = None ds = None # Test updating a read-only file ds = gdaltest.kea_driver.Create('tmp/out.kea', 1, 1) ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.Open('tmp/out.kea') gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.SetProjection('a') gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.SetGeoTransform([1, 2, 3, 4, 5, 6]) gdal.PopErrorHandler() assert ret != 0 # Disabled for now since some of them cause memory leaks or # crash in the HDF5 library finalizer if False: # pylint: disable=using-constant-test gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.SetMetadataItem('foo', 'bar') gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.SetMetadata({'foo': 'bar'}) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.GetRasterBand(1).SetMetadataItem('foo', 'bar') gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.GetRasterBand(1).SetMetadata({'foo': 'bar'}) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.SetGCPs([], "") gdal.PopErrorHandler() assert ret != 0 with gdaltest.error_handler(): ret = ds.AddBand(gdal.GDT_Byte) assert ret != 0 with gdaltest.error_handler(): ret = ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, '\0') assert ret != 0 with gdaltest.error_handler(): ret = ds.FlushCache() assert ret != 0 assert ds.GetRasterBand(1).Checksum() == 3 ds = None gdaltest.kea_driver.Delete('tmp/src.kea') gdaltest.kea_driver.Delete('tmp/out.kea') ############################################################################### # Test Create() creation options def test_kea_5(): if gdaltest.kea_driver is None: pytest.skip() options = ['IMAGEBLOCKSIZE=15', 'ATTBLOCKSIZE=100', 'MDC_NELMTS=10', 'RDCC_NELMTS=256', 'RDCC_NBYTES=500000', 'RDCC_W0=0.5', 'SIEVE_BUF=32768', 'META_BLOCKSIZE=1024', 'DEFLATE=9', 'THEMATIC=YES'] ds = gdaltest.kea_driver.Create("tmp/out.kea", 100, 100, 3, options=options) ds = None ds = gdal.Open('tmp/out.kea') assert ds.GetRasterBand(1).GetBlockSize() == [15, 15] assert ds.GetRasterBand(1).GetMetadataItem('LAYER_TYPE') == 'thematic', \ ds.GetRasterBand(1).GetMetadata() assert ds.GetRasterBand(1).Checksum() == 0 assert ds.GetGeoTransform() == (0, 1, 0, 0, 0, -1) assert ds.GetProjectionRef() == '' ds = None gdaltest.kea_driver.Delete('tmp/out.kea') ############################################################################### # Test metadata def test_kea_6(): if gdaltest.kea_driver is None: pytest.skip() ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1, 5) ds.SetMetadata({'foo': 'bar'}) ds.SetMetadataItem('bar', 'baw') ds.GetRasterBand(1).SetMetadata({'bar': 'baz'}) ds.GetRasterBand(1).SetDescription('desc') ds.GetRasterBand(2).SetMetadata({'LAYER_TYPE': 'any_string_that_is_not_athematic_is_thematic'}) ds.GetRasterBand(3).SetMetadata({'LAYER_TYPE': 'athematic'}) ds.GetRasterBand(4).SetMetadataItem('LAYER_TYPE', 'thematic') ds.GetRasterBand(5).SetMetadataItem('LAYER_TYPE', 'athematic') assert ds.SetMetadata({'foo': 'bar'}, 'other_domain') != 0 assert ds.SetMetadataItem('foo', 'bar', 'other_domain') != 0 assert ds.GetRasterBand(1).SetMetadata({'foo': 'bar'}, 'other_domain') != 0 assert ds.GetRasterBand(1).SetMetadataItem('foo', 'bar', 'other_domain') != 0 ds = None ds = gdal.Open('tmp/out.kea') assert ds.GetMetadata('other_domain') == {} assert ds.GetMetadataItem('item', 'other_domain') is None assert ds.GetRasterBand(1).GetMetadata('other_domain') == {} assert ds.GetRasterBand(1).GetMetadataItem('item', 'other_domain') is None md = ds.GetMetadata() assert md['foo'] == 'bar' assert ds.GetMetadataItem('foo') == 'bar' assert ds.GetMetadataItem('bar') == 'baw' assert ds.GetRasterBand(1).GetDescription() == 'desc' md = ds.GetRasterBand(1).GetMetadata() assert md['bar'] == 'baz' assert ds.GetRasterBand(1).GetMetadataItem('bar') == 'baz' assert ds.GetRasterBand(2).GetMetadataItem('LAYER_TYPE') == 'thematic' assert ds.GetRasterBand(3).GetMetadataItem('LAYER_TYPE') == 'athematic' assert ds.GetRasterBand(4).GetMetadataItem('LAYER_TYPE') == 'thematic' assert ds.GetRasterBand(5).GetMetadataItem('LAYER_TYPE') == 'athematic' out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) ds = None assert out2_ds.GetMetadataItem('foo') == 'bar' assert out2_ds.GetRasterBand(1).GetMetadataItem('bar') == 'baz' out2_ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test georef def test_kea_7(): if gdaltest.kea_driver is None: pytest.skip() sr = osr.SpatialReference() sr.ImportFromEPSG(4326) # Geotransform ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1) assert ds.GetGCPCount() == 0 assert ds.SetGeoTransform([1, 2, 3, 4, 5, 6]) == 0 assert ds.SetProjection(sr.ExportToWkt()) == 0 ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) ds = None assert out2_ds.GetGCPCount() == 0 assert out2_ds.GetGeoTransform() == (1, 2, 3, 4, 5, 6) assert out2_ds.GetProjectionRef() != '' out2_ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') # GCP ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1) gcp1 = gdal.GCP(0, 1, 2, 3, 4) gcp1.Id = "id" gcp1.Info = "info" gcp2 = gdal.GCP(0, 1, 2, 3, 4) gcps = [gcp1, gcp2] ds.SetGCPs(gcps, sr.ExportToWkt()) ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) ds = None assert out2_ds.GetGCPCount() == 2 assert out2_ds.GetGCPProjection() != '' got_gcps = out2_ds.GetGCPs() for i in range(2): assert (got_gcps[i].GCPX == gcps[i].GCPX and got_gcps[i].GCPY == gcps[i].GCPY and \ got_gcps[i].GCPZ == gcps[i].GCPZ and got_gcps[i].GCPPixel == gcps[i].GCPPixel and \ got_gcps[i].GCPLine == gcps[i].GCPLine and got_gcps[i].Id == gcps[i].Id and \ got_gcps[i].Info == gcps[i].Info) out2_ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test colortable def test_kea_8(): if gdaltest.kea_driver is None: pytest.skip() for i in range(2): ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1) assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).SetColorTable(None) != 0 ct = gdal.ColorTable() ct.SetColorEntry(0, (0, 255, 0, 255)) ct.SetColorEntry(1, (255, 0, 255, 255)) ct.SetColorEntry(2, (0, 0, 255, 255)) assert ds.GetRasterBand(1).SetColorTable(ct) == 0 if i == 1: # And again assert ds.GetRasterBand(1).SetColorTable(ct) == 0 ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) ds = None got_ct = out2_ds.GetRasterBand(1).GetColorTable() assert got_ct.GetCount() == 3, 'Got wrong color table entry count.' assert got_ct.GetColorEntry(1) == (255, 0, 255, 255), \ 'Got wrong color table entry.' out2_ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test color interpretation def test_kea_9(): if gdaltest.kea_driver is None: pytest.skip() ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1, gdal.GCI_YCbCr_CrBand - gdal.GCI_GrayIndex + 1) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex for i in range(gdal.GCI_GrayIndex, gdal.GCI_YCbCr_CrBand + 1): ds.GetRasterBand(i).SetColorInterpretation(i) ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) ds = None for i in range(gdal.GCI_GrayIndex, gdal.GCI_YCbCr_CrBand + 1): assert out2_ds.GetRasterBand(i).GetColorInterpretation() == i, \ 'Got wrong color interpretation.' out2_ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test nodata def test_kea_10(): if gdaltest.kea_driver is None: pytest.skip() for (dt, nd, expected_nd) in [(gdal.GDT_Byte, 0, 0), (gdal.GDT_Byte, 1.1, 1.0), (gdal.GDT_Byte, 255, 255), (gdal.GDT_Byte, -1, None), (gdal.GDT_Byte, 256, None), (gdal.GDT_UInt16, 0, 0), (gdal.GDT_UInt16, 65535, 65535), (gdal.GDT_UInt16, -1, None), (gdal.GDT_UInt16, 65536, None), (gdal.GDT_Int16, -32768, -32768), (gdal.GDT_Int16, 32767, 32767), (gdal.GDT_Int16, -32769, None), (gdal.GDT_Int16, 32768, None), (gdal.GDT_UInt32, 0, 0), (gdal.GDT_UInt32, 0xFFFFFFFF, 0xFFFFFFFF), (gdal.GDT_UInt32, -1, None), (gdal.GDT_UInt32, 0xFFFFFFFF + 1, None), (gdal.GDT_Int32, -2147483648, -2147483648), (gdal.GDT_Int32, 2147483647, 2147483647), (gdal.GDT_Int32, -2147483649, None), (gdal.GDT_Int32, 2147483648, None), (gdal.GDT_Float32, 0.5, 0.5), ]: ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1, 1, dt) assert ds.GetRasterBand(1).GetNoDataValue() is None ds.GetRasterBand(1).SetNoDataValue(nd) if ds.GetRasterBand(1).GetNoDataValue() != expected_nd: print(dt) pytest.fail('Got wrong nodata.') ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) ds = None if out2_ds.GetRasterBand(1).GetNoDataValue() != expected_nd: print(dt) pytest.fail('Got wrong nodata.') out2_ds.GetRasterBand(1).DeleteNoDataValue() out2_ds = None ds = gdal.Open('tmp/out2.kea') assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test AddBand def test_kea_11(): if gdaltest.kea_driver is None: pytest.skip() ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1, 1, gdal.GDT_Byte) ds = None ds = gdal.Open('tmp/out.kea', gdal.GA_Update) assert ds.AddBand(gdal.GDT_Byte) == 0 assert ds.AddBand(gdal.GDT_Int16, options=['DEFLATE=9']) == 0 ds = None ds = gdal.Open('tmp/out.kea') assert ds.RasterCount == 3 assert ds.GetRasterBand(2).DataType == gdal.GDT_Byte assert ds.GetRasterBand(3).DataType == gdal.GDT_Int16 ds = None gdaltest.kea_driver.Delete('tmp/out.kea') ############################################################################### # Test RAT def test_kea_12(): if gdaltest.kea_driver is None: pytest.skip() ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1, 1, gdal.GDT_Byte) assert ds.GetRasterBand(1).GetDefaultRAT().GetColumnCount() == 0 assert ds.GetRasterBand(1).SetDefaultRAT(None) != 0 rat = ds.GetRasterBand(1).GetDefaultRAT() rat.CreateColumn('col_real_generic', gdal.GFT_Real, gdal.GFU_Generic) assert ds.GetRasterBand(1).SetDefaultRAT(rat) == 0 rat = ds.GetRasterBand(1).GetDefaultRAT() rat.CreateColumn('col_integer_pixelcount', gdal.GFT_Real, gdal.GFU_PixelCount) rat.CreateColumn('col_string_name', gdal.GFT_String, gdal.GFU_Name) rat.CreateColumn('col_integer_red', gdal.GFT_Integer, gdal.GFU_Red) rat.CreateColumn('col_integer_green', gdal.GFT_Integer, gdal.GFU_Green) rat.CreateColumn('col_integer_blue', gdal.GFT_Integer, gdal.GFU_Blue) rat.CreateColumn('col_integer_alpha', gdal.GFT_Integer, gdal.GFU_Alpha) rat.SetRowCount(1) rat.SetValueAsString(0, 0, "1.23") rat.SetValueAsInt(0, 0, 1) rat.SetValueAsDouble(0, 0, 1.23) rat.SetValueAsInt(0, 2, 0) rat.SetValueAsDouble(0, 2, 0) rat.SetValueAsString(0, 2, 'foo') rat.SetValueAsString(0, 3, "123") rat.SetValueAsDouble(0, 3, 123) rat.SetValueAsInt(0, 3, 123) cloned_rat = rat.Clone() assert ds.GetRasterBand(1).SetDefaultRAT(rat) == 0 ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) rat = out2_ds.GetRasterBand(1).GetDefaultRAT() for i in range(7): assert rat.GetColOfUsage(rat.GetUsageOfCol(i)) == i assert cloned_rat.GetNameOfCol(0) == 'col_real_generic' assert cloned_rat.GetTypeOfCol(0) == gdal.GFT_Real assert cloned_rat.GetUsageOfCol(0) == gdal.GFU_Generic assert cloned_rat.GetUsageOfCol(1) == gdal.GFU_PixelCount assert cloned_rat.GetTypeOfCol(2) == gdal.GFT_String assert cloned_rat.GetTypeOfCol(3) == gdal.GFT_Integer assert rat.GetColumnCount() == cloned_rat.GetColumnCount() assert rat.GetRowCount() == cloned_rat.GetRowCount() for i in range(rat.GetColumnCount()): assert rat.GetNameOfCol(i) == cloned_rat.GetNameOfCol(i) assert rat.GetTypeOfCol(i) == cloned_rat.GetTypeOfCol(i) assert rat.GetUsageOfCol(i) == cloned_rat.GetUsageOfCol(i) gdal.PushErrorHandler('CPLQuietErrorHandler') rat.GetNameOfCol(-1) rat.GetTypeOfCol(-1) rat.GetUsageOfCol(-1) rat.GetNameOfCol(rat.GetColumnCount()) rat.GetTypeOfCol(rat.GetColumnCount()) rat.GetUsageOfCol(rat.GetColumnCount()) rat.GetValueAsDouble(-1, 0) rat.GetValueAsInt(-1, 0) rat.GetValueAsString(-1, 0) rat.GetValueAsDouble(rat.GetColumnCount(), 0) rat.GetValueAsInt(rat.GetColumnCount(), 0) rat.GetValueAsString(rat.GetColumnCount(), 0) rat.GetValueAsDouble(0, -1) rat.GetValueAsInt(0, -1) rat.GetValueAsString(0, -1) rat.GetValueAsDouble(0, rat.GetRowCount()) rat.GetValueAsInt(0, rat.GetRowCount()) rat.GetValueAsString(0, rat.GetRowCount()) gdal.PopErrorHandler() assert rat.GetValueAsDouble(0, 0) == 1.23 assert rat.GetValueAsInt(0, 0) == 1 assert rat.GetValueAsString(0, 0) == '1.23' assert rat.GetValueAsInt(0, 3) == 123 assert rat.GetValueAsDouble(0, 3) == 123 assert rat.GetValueAsString(0, 3) == '123' assert rat.GetValueAsString(0, 2) == 'foo' assert rat.GetValueAsInt(0, 2) == 0 assert rat.GetValueAsDouble(0, 2) == 0 ds = None out2_ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test overviews def test_kea_13(): if gdaltest.kea_driver is None: pytest.skip() src_ds = gdal.Open('data/byte.tif') ds = gdaltest.kea_driver.CreateCopy("tmp/out.kea", src_ds) src_ds = None ds.BuildOverviews('NEAR', [2]) ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) # yes CreateCopy() of KEA copies overviews assert out2_ds.GetRasterBand(1).GetOverviewCount() == 1 assert out2_ds.GetRasterBand(1).GetOverview(0).Checksum() == 1087 assert out2_ds.GetRasterBand(1).GetOverview(0).GetDefaultRAT() is None assert out2_ds.GetRasterBand(1).GetOverview(0).SetDefaultRAT(None) != 0 assert out2_ds.GetRasterBand(1).GetOverview(-1) is None assert out2_ds.GetRasterBand(1).GetOverview(1) is None out2_ds = None ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test mask bands def test_kea_14(): if gdaltest.kea_driver is None: pytest.skip() ds = gdaltest.kea_driver.Create("tmp/out.kea", 1, 1, 1, gdal.GDT_Byte) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALL_VALID assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 3 ds.GetRasterBand(1).CreateMaskBand(0) assert ds.GetRasterBand(1).GetMaskFlags() == 0 assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 3 ds.GetRasterBand(1).GetMaskBand().Fill(0) assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 0 ds = None ds = gdal.Open('tmp/out.kea') out2_ds = gdaltest.kea_driver.CreateCopy('tmp/out2.kea', ds) # yes CreateCopy() of KEA copies overviews assert out2_ds.GetRasterBand(1).GetMaskFlags() == 0 assert out2_ds.GetRasterBand(1).GetMaskBand().Checksum() == 0 out2_ds = None ds = None gdaltest.kea_driver.Delete('tmp/out.kea') gdaltest.kea_driver.Delete('tmp/out2.kea') ############################################################################### # Test /vsi functionality def test_kea_15(): if gdaltest.kea_driver is None: pytest.skip() # create an temp image ds = gdaltest.kea_driver.Create('tmp/vsitest.kea', 1, 1) ds.GetRasterBand(1).Fill(255) ds = None # load it into /vsimem and try and open it gdal.FileFromMemBuffer('/vsimem/foo.kea', open('tmp/vsitest.kea', 'rb').read()) ds = gdal.Open('/vsimem/foo.kea') assert ds.GetDriver().ShortName == "KEA" ds = None gdal.Unlink('/vsimem/foo.kea') gdaltest.kea_driver.Delete('tmp/vsitest.kea') def test_kea_destroy(): # there is always a 'tmp/out.kea.aux.xml' left behind by # a few of the tests gdal.Unlink('tmp/out.kea.aux.xml') gdalautotest-3.2.2/gdrivers/leveller.py0000775000175000017500000000351314020414366016712 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: leveller.py 9db4c8f73502a780277ce23984c9e0ac35fd8120 2020-05-10 15:28:01 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Leveller driver support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Perform simple read test. def test_leveller_1(): tst = gdaltest.GDALTest('Leveller', 'leveller/ter6test.ter', 1, 33441) return tst.testOpen() gdalautotest-3.2.2/gdrivers/xpm.py0000775000175000017500000000455214020414366015710 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: xpm.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for XPM driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest from osgeo import gdal import gdaltest xpm_list = [('http://download.osgeo.org/gdal/data/xpm', 'utm.xpm', 44206, -1)] @pytest.mark.parametrize( 'downloadURL,fileName,checksum,download_size', xpm_list, ids=[item[1] for item in xpm_list], ) def test_xpm(downloadURL, fileName, checksum, download_size): if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): pytest.skip() ds = gdal.Open('tmp/cache/' + fileName) assert ds.GetRasterBand(1).Checksum() == checksum, 'Bad checksum. Expected %d, got %d' % (checksum, ds.GetRasterBand(1).Checksum()) def test_xpm_1(): tst = gdaltest.GDALTest('XPM', 'byte.tif', 1, 4583) return tst.testCreateCopy(vsimem=1, check_minmax=False) gdalautotest-3.2.2/gdrivers/db2.py0000775000175000017500000001731614020414366015555 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # # Project: GDAL/OGR Test Suite # Purpose: Test DB2 raster functionality. # Author: David Adler - dadler@adtechgeospatial.com # ############################################################################### # Copyright (c) 2014, Even Rouault # Copyright (c) 2016, David Adler # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import sys import pytest # Make sure we run from the directory of the script if os.path.basename(sys.argv[0]) == os.path.basename(__file__): if os.path.dirname(sys.argv[0]) != '': os.chdir(os.path.dirname(sys.argv[0])) from osgeo import gdal import gdaltest ############################################################################### # Test if DB2 and tile drivers are available def test_gpkg_init(): gdaltest.db2_drv = None gdaltest.db2_drv = gdal.GetDriverByName('DB2ODBC') if gdaltest.db2_drv is None: pytest.skip() gdaltest.png_dr = gdal.GetDriverByName('PNG') gdaltest.jpeg_dr = gdal.GetDriverByName('JPEG') gdaltest.webp_dr = gdal.GetDriverByName('WEBP') gdaltest.webp_supports_rgba = False if gdaltest.webp_dr is not None and gdal.GetConfigOption("GPKG_SIMUL_WEBP_3BAND") is None: md = gdaltest.webp_dr.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') >= 0: gdaltest.webp_supports_rgba = True if 'DB2_TEST_SERVER' in os.environ: gdaltest.db2_test_server = "DB2ODBC:" + os.environ['DB2_TEST_SERVER'] else: gdaltest.db2_drv = None pytest.skip('Environment variable DB2_TEST_SERVER not found') print("\ntest server: " + gdaltest.db2_test_server + "\n") ############################################################################### # def get_expected_checksums(src_ds, tile_drv, working_bands, extend_src=True, clamp_output=True): if extend_src: mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, working_bands) else: mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, working_bands) for i in range(working_bands): if src_ds.RasterCount == 2 and working_bands == 3: src_band = 1 elif src_ds.RasterCount == 2 and working_bands == 4: if i < 3: src_band = 1 else: src_band = 2 elif src_ds.RasterCount == 1: src_band = 1 else: src_band = i + 1 data = src_ds.GetRasterBand(src_band).ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize) mem_ds.GetRasterBand(i + 1).WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data) if tile_drv.ShortName == 'PNG': options = [] else: options = ['QUALITY=75'] tmp_ds = tile_drv.CreateCopy('/vsimem/tmp.' + tile_drv.ShortName, mem_ds, options=options) if clamp_output: mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, working_bands) mem_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, tmp_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) expected_cs = [mem_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] else: tmp_ds.FlushCache() expected_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] mem_ds = None tmp_ds = None gdal.Unlink('/vsimem/tmp.' + tile_drv.ShortName) return expected_cs ############################################################################### # def check_tile_format(out_ds, expected_format, expected_band_count, expected_ct, row=0, col=0, zoom_level=None): if zoom_level is None: zoom_level_str = "(SELECT MAX(zoom_level) FROM tmp)" else: zoom_level_str = str(zoom_level) sql_lyr = out_ds.ExecuteSQL('SELECT GDAL_GetMimeType(tile_data), ' + 'GDAL_GetBandCount(tile_data), ' + 'GDAL_HasColorTable(tile_data) FROM tmp ' + 'WHERE zoom_level = %s AND tile_column = %d AND tile_row = %d' % (zoom_level_str, col, row)) feat = sql_lyr.GetNextFeature() if feat is not None: mime_type = feat.GetField(0) band_count = feat.GetField(1) has_ct = feat.GetField(2) else: mime_type = None band_count = None has_ct = None out_ds.ReleaseResultSet(sql_lyr) out_ds = None if expected_format is None: if mime_type is None: return pytest.fail() if expected_format == 'PNG': expected_mime_type = 'image/png' elif expected_format == 'JPEG': expected_mime_type = 'image/jpeg' elif expected_format == 'WEBP': expected_mime_type = 'image/x-webp' assert mime_type == expected_mime_type assert band_count == expected_band_count assert expected_ct == has_ct ############################################################################### # Single band, PNG def test_gpkg_1(): if gdaltest.db2_drv is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() # With padding ds = gdal.Open('data/byte.tif') expected_cs = ds.GetRasterBand(1).Checksum() # clamped_expected_cs = get_expected_checksums(ds, gdaltest.png_dr, 1, clamp_output = False)[0] expected_gt = ds.GetGeoTransform() expected_wkt = ds.GetProjectionRef() out_ds = gdaltest.db2_drv.CreateCopy('DB2ODBC:database=samp105;DSN=SAMP105A', ds, options=['TILE_FORMAT=PNG']) out_ds = None ds = None out_ds = gdal.OpenEx(gdaltest.db2_test_server, gdal.OF_RASTER | gdal.OF_UPDATE, open_options=['TABLE=byte']) bnd = out_ds.GetRasterBand(1) assert bnd.Checksum() == 4672, 'Didnt get expected checksum on reopened file' assert bnd.ComputeRasterMinMax() == (74.0, 255.0), \ 'ComputeRasterMinMax() returned wrong value' got_gt = out_ds.GetGeoTransform() for i in range(6): assert expected_gt[i] == pytest.approx(got_gt[i], abs=1e-8) got_wkt = out_ds.GetProjectionRef() print("\n** expected_wkt " + expected_wkt + " **\n") print("\n** got_wkt " + got_wkt + " **\n") # string comparison doesn't work with DB2 due to differences in # the WKT (similar but different) # just check if it contains '11N' for NAD27 UTM zone 11N assert got_wkt.find('11N') != -1 expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ############################################################################### gdalautotest-3.2.2/gdrivers/dds.py0000664000175000017500000000564514020414366015657 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: dds.py 39fef033795dafb3f04fb6a935785aedbd003dc7 2020-05-10 17:33:47 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test DDS driver # Author: Even Rouault # ############################################################################### # Copyright (c) 2019 Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest from osgeo import gdal pytestmark = pytest.mark.require_driver('DDS') test_list = [ ('DXT1', [11376, 57826, 34652, 32919]), ('DXT3', [12272, 59240, 34811, 7774]), ('DXT5', [12272, 59240, 34811, 10402]), ('ETC1', [9560, 57939, 30566]), ] @pytest.mark.parametrize( 'compression,checksums', test_list, ids=[row[0] for row in test_list] ) def test_dds(compression,checksums): src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') ds = gdal.GetDriverByName('DDS').CreateCopy('/vsimem/out.dds', src_ds, options=['FORMAT=' + compression]) assert ds assert ds.RasterCount == len(checksums) assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == compression assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert [ds.GetRasterBand(i+1).Checksum() for i in range(ds.RasterCount)] == checksums def test_dds_no_compression(): ref_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') ds = gdal.Open('data/dds/stefan_full_rgba_no_compression.dds') assert ds assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand ref_checksum = [ref_ds.GetRasterBand(i+1).Checksum() for i in range(4)] assert [ds.GetRasterBand(i+1).Checksum() for i in range(4)] == ref_checksum gdalautotest-3.2.2/gdrivers/daas.py0000775000175000017500000016127014020414366016015 0ustar eveneven#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################### # $Id: daas.py 72d72e44948b097fbe937beb0c171c8d529c4309 2021-01-21 17:12:03 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: DAAS driver test suite. # Author: Even Rouault, even.rouault at spatialys.com # ############################################################################### # Copyright (c) 2018-2019, Airbus DS Intelligence # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import copy import json import sys sys.path.append('../pymod') from osgeo import gdal import gdaltest import webserver import pytest pytestmark = pytest.mark.require_driver('DAAS') ############################################################################### @pytest.fixture(autouse=True, scope='module') def startup_and_cleanup(): # Unset environment variables that influence the driver behaviour daas_vars = {} for var in ('GDAL_DAAS_API_KEY', 'GDAL_DAAS_CLIENT_ID', 'GDAL_DAAS_AUTH_URL', 'GDAL_DAAS_ACCESS_TOKEN'): daas_vars[var] = gdal.GetConfigOption(var) if daas_vars[var] is not None: gdal.SetConfigOption(var, "") (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) if gdaltest.webserver_port == 0: pytest.skip() yield if gdaltest.webserver_port != 0: webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) gdal.RmdirRecursive('/vsimem/cache_dir') for var in daas_vars: gdal.SetConfigOption(var, daas_vars[var]) ############################################################################### def test_daas_missing_parameters(): with gdaltest.error_handler(): ds = gdal.Open("DAAS:") assert not ds ############################################################################### def test_daas_authentication_failure(): with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'GDAL_DAAS_CLIENT_ID': 'client_id', 'missing_GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'missing_GDAL_DAAS_CLIENT_ID': 'client_id', 'GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds handler = webserver.SequentialHandler() handler.add('POST', '/auth', 400, {}, '{"error":"unauthorized_client","error_description":"UNKNOWN_CLIENT: Client was not identified by any client authenticator"}') with webserver.install_http_handler(handler): with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'GDAL_DAAS_CLIENT_ID': 'client_id', 'GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds handler = webserver.SequentialHandler() handler.add('POST', '/auth', 200, {}, 'invalid json') with webserver.install_http_handler(handler): with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'GDAL_DAAS_CLIENT_ID': 'client_id', 'GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds handler = webserver.SequentialHandler() handler.add('POST', '/auth', 200, {}, '{ "missing_access_token": null }') with webserver.install_http_handler(handler): with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'GDAL_DAAS_CLIENT_ID': 'client_id', 'GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): ds = gdal.Open("DAAS:https://127.0.0.1:99999") assert not ds ############################################################################### def test_daas_authentication(): # API_KEY + CLIENT_ID handler = webserver.SequentialHandler() handler.add('POST', '/auth', 200, {'Content-type': 'application/json'}, '{"access_token": "my_token"}', expected_body='client_id=client_id&apikey=api_key&grant_type=api_key'.encode('ascii')) handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, expected_headers={'Authorization': 'Bearer my_token'}) with webserver.install_http_handler(handler): with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port, 'GDAL_DAAS_CLIENT_ID': 'client_id', 'GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) # Test X-Forwarded-User handler = webserver.SequentialHandler() handler.add('POST', '/auth', 200, {}, '{ "access_token": "my_token" }') handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, expected_headers={'Authorization': 'Bearer my_token', 'X-Forwarded-User': 'user'}) with webserver.install_http_handler(handler): with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port, 'GDAL_DAAS_CLIENT_ID': 'client_id', 'GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['X_FORWARDED_USER=user']) # Test token expiration handler = webserver.SequentialHandler() handler.add('POST', '/auth', 200, {}, '{ "access_token": "my_token", "expires_in": 1 }') handler.add('POST', '/auth', 200, {}, '{ "access_token": "my_token", "expires_in": 1 }') handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, {}) with webserver.install_http_handler(handler): with gdaltest.config_options({'GDAL_DAAS_AUTH_URL': 'http://127.0.0.1:%d/auth' % gdaltest.webserver_port, 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port, 'GDAL_DAAS_CLIENT_ID': 'client_id', 'GDAL_DAAS_API_KEY': 'api_key'}): with gdaltest.error_handler(): gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) # Test ACCESS_TOKEN handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, expected_headers={'Authorization': 'Bearer my_token'}) with webserver.install_http_handler(handler): with gdaltest.config_options({'GDAL_DAAS_ACCESS_TOKEN': 'my_token', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): gdal.OpenEx( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) ############################################################################### def test_daas_getimagemetadata_failure(): def test_json(j): handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps(j)) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) return ds # Empty content returned by server handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert not ds # Error with json payload handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 404, {}, '{ "foo":"bar" }') with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert not ds # Success but empty response handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert not ds # Success but invalid JSon handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, 'invalid json') with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert not ds min_valid_json = { "properties": { "width": 1, "height": 1, "_links": { "getBuffer": { "href": "http://example.com" } }, "bands": [{"name": "PAN", "pixelType": "Byte"}] } } # Check that min_valid_json actually works gdal.ErrorReset() assert test_json(min_valid_json) is not None assert gdal.GetLastErrorMsg() == '' # Valid JSon but missing response/payload/payload/imageMetadata/properties or properties assert test_json({}) is None # Valid JSon but missing properties for prop_to_del in ['width', 'height', 'bands', '_links']: j = copy.deepcopy(min_valid_json) del j['properties'][prop_to_del] assert test_json(j) is None # Valid JSon but invalid width (negative value) j = copy.deepcopy(min_valid_json) j['properties']['width'] = -1 assert test_json(j) is None # Valid JSon but invalid height (string) j = copy.deepcopy(min_valid_json) j['properties']['height'] = 'foo' assert test_json(j) is None # Missing pixelType j = copy.deepcopy(min_valid_json) del j['properties']['bands'][0]['pixelType'] assert test_json(j) is None # Invalid pixelType j = copy.deepcopy(min_valid_json) j['properties']['bands'][0]['pixelType'] = 'foo' assert test_json(j) is None # Invalid rpc j = copy.deepcopy(min_valid_json) j['properties']['rpc'] = {} gdal.ErrorReset() ds = test_json(j) is None assert gdal.GetLastErrorMsg() != '' ############################################################################### def test_daas_getimagemetadata(): # Valid JSon but invalid height (string) handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 3, "actualBitDepth": 7, "noDataValue": 0, "metadataInt": 123, "acquisitionDate": "2018-02-05T22:28:27.242Z", "cloudCover": 12.345678, "satellite": "MY_SATELLITE", "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "geotransform": [2, 0, 0.1, 49, 0, -0.1], "bands": [ { "name": "PAN", "description": "Panchromatic band", "colorInterpretation": "GRAY", "pixelType": "Byte" } ], "srsExpression": { "names": [ { "type": "unused", "value": "unused" }, { "type": "proj4", "value": "still_unused" }, { "type": "urn", "value": "urn:ogc:def:crs:EPSG::4326" }, { "type": "proj4", "value": "still_unused" }, { "type": "unused", "value": "unused" }, ] }, "rpc": { "sampOff": 1, "lineOff": 2, "latOff": 3, "longOff": 4, "heightOff": 5, "lineScale": 6, "sampScale": 7, "latScale": 8, "longScale": 9, "heightScale": 10, "lineNumCoeff": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "lineDenCoeff": [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "sampNumCoeff": [2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1], "sampDenCoeff": [3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2] } }}}}}})) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert ds assert ds.RasterXSize == 2 assert ds.RasterYSize == 3 assert ds.RasterCount == 1 assert ds.GetGeoTransform() == (2, 0, 0.1, 49, 0, -0.1) assert '4326' in ds.GetProjectionRef() md = ds.GetMetadata() assert md == {'metadataInt': '123', 'satellite': 'MY_SATELLITE', 'cloudCover': '12.345678', 'acquisitionDate': '2018-02-05T22:28:27.242Z'} md = ds.GetMetadata('IMAGERY') assert md == {'ACQUISITIONDATETIME': '2018-02-05 22:28:27', 'CLOUDCOVER': '12.35', 'SATELLITEID': 'MY_SATELLITE'} rpc = ds.GetMetadata('RPC') expected_rpc = { 'SAMP_OFF': '1', 'LINE_OFF': '2', 'LAT_OFF': '3', 'LONG_OFF': '4', 'HEIGHT_OFF': '5', 'LINE_SCALE': '6', 'SAMP_SCALE': '7', 'LAT_SCALE': '8', 'LONG_SCALE': '9', 'HEIGHT_SCALE': '10', 'LINE_NUM_COEFF': '0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9', 'LINE_DEN_COEFF': '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0', 'SAMP_NUM_COEFF': '2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1', 'SAMP_DEN_COEFF': '3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2', } assert rpc == expected_rpc assert ds.GetRasterBand(1).GetNoDataValue() == 0.0 assert ds.GetRasterBand(1).GetDescription() == 'PAN' assert ds.GetRasterBand(1).GetMetadataItem('DESCRIPTION') == 'Panchromatic band' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(0) is None ############################################################################### def test_daas_getimagemetadata_http_retry(): # 4 retries and success handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 502, {}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 503, {}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 504, {}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 500, {}) metadata_response = json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 1, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "Byte" }, { "name": "Band 2", "pixelType": "Byte" }, { "name": "Band 3", "pixelType": "Byte" } ] }}}}}}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, metadata_response) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_INITIAL_RETRY_DELAY': '0.001', 'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert ds # 4 retries and failure handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 502, {}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 503, {}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 504, {}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 500, {}) handler.add('GET', '/daas/sensors/products/foo/images/bar', 500, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_INITIAL_RETRY_DELAY': '0.001', 'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert not ds # No retry on HTTP 403 handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 403, {}) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_INITIAL_RETRY_DELAY': '0.001', 'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.Open( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert not ds ############################################################################### def test_daas_getbuffer_failure(): metadata_response = json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 1, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "Byte" }, { "name": "Band 2", "pixelType": "Byte" }, { "name": "Band 3", "pixelType": "Byte" } ] }}}}}}) handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, metadata_response) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) assert ds # HTTP 404 handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 404) handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # HTTP 404 with payload ds.FlushCache() handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 404, {}, 'my error message') handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # HTTP 200 but invalid multipart ds.FlushCache() handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {}, 'not multipart') handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # Missing data payload part ds.FlushCache() handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # Missing metadata part ds.FlushCache() handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream ABCDEF --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # Inconsistent metadata ds.FlushCache() handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream ABCDEF --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":3,"height":1}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # Inconsistent data size ds.FlushCache() handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream ABCDE --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n')) handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # Invalid PNG image ds.FlushCache() handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, metadata_response) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx( "DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert ds handler = webserver.SequentialHandler() png_content = 'This is not png !'.encode('ascii') handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: image/png """.replace('\n', '\r\n').encode('ascii') + png_content + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii')) handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data # Inconsistent PNG image ds.FlushCache() handler = webserver.SequentialHandler() png_content = open('data/png/test.png', 'rb').read() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: image/png """.replace('\n', '\r\n').encode('ascii') + png_content + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii')) handler.add('POST', '/getbuffer', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster() assert not data ############################################################################### def test_daas_getbuffer_pixel_encoding_failures(): handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 1, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "UInt16" } ] }}}}}})) # PNG with UInt16 -> unsupported gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=PNG']) assert ds assert gdal.GetLastErrorMsg() != '' # JPEG with UInt16 -> unsupported gdal.ErrorReset() handler.req_count = 0 with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=JPEG']) assert ds assert gdal.GetLastErrorMsg() != '' # PIXEL_ENCODING=FOO -> unsupported gdal.ErrorReset() handler.req_count = 0 with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=FOO']) assert not ds # JPEG2000 with Float32 -> unsupported handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 1, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "Float32", } ] }}}}}})) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): with gdaltest.error_handler(): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=JPEG2000']) assert ds assert gdal.GetLastErrorMsg() != '' ############################################################################### def test_daas_getbuffer_raw(): handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 1, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "Byte" }, { "name": "Band 2", "pixelType": "Byte" }, { "name": "Band 3", "pixelType": "Byte" } ] }}}}}})) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) assert ds handler = webserver.SequentialHandler() response = """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream ABCDEF --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":1}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" response = response.replace('\n', '\r\n') expected_body = """{ "bbox":{ "srs":{ "type":"image" }, "ul":{ "x":0, "y":0 }, "lr":{ "x":2, "y":1 } }, "target-model":{ "step":{ "x":0, "y":0 }, "size":{ "columns":2, "lines":1 }, "sampling-algo":"NEAREST", "strictOutputSize":true, "srs":{ "type":"image" } }, "bands":[ "Band 1", "Band 2", "Band 3" ] }""".encode('ascii') handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response, expected_headers={'Accept': 'application/octet-stream'}, expected_body=expected_body) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster() assert data == 'AB'.encode('ascii') ############################################################################### def _daas_getbuffer(pixel_encoding, drv_name, drv_options, mime_type): drv = gdal.GetDriverByName(drv_name) if drv is None: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 100, "height": 100, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "Byte" }, { "name": "Band 2", "pixelType": "Byte" }, { "name": "Band 3", "pixelType": "Byte" } ] }}}}}})) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=' + pixel_encoding]) assert ds handler = webserver.SequentialHandler() src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3) src_ds.GetRasterBand(1).WriteRaster( 0, 0, 100, 100, 'A', buf_xsize=1, buf_ysize=1) src_ds.GetRasterBand(2).WriteRaster(0, 0, 100, 100, 'B', buf_xsize = 1, buf_ysize = 1) src_ds.GetRasterBand(3).WriteRaster(0, 0, 100, 100, 'C', buf_xsize = 1, buf_ysize = 1) tmpfile = '/vsimem/tmp' drv.CreateCopy(tmpfile, src_ds, options=drv_options) f = gdal.VSIFOpenL(tmpfile, 'rb') content = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) gdal.Unlink(tmpfile) response = ("""--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: """ + mime_type + """ """).replace('\n', '\r\n').encode('ascii') + content + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":100,"height":100}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii') handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response, expected_headers={'Accept': mime_type}) with webserver.install_http_handler(handler): with gdaltest.error_handler(): data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) assert data == 'A'.encode('ascii') data = ds.GetRasterBand(2).ReadRaster(0, 0, 1, 1) assert data == 'B'.encode('ascii') ############################################################################### def test_daas_getbuffer_png(): _daas_getbuffer('PNG', 'PNG', [], 'image/png') ############################################################################### def test_daas_getbuffer_jpeg(): _daas_getbuffer('JPEG', 'JPEG', ['QUALITY=100'], 'image/jpeg') ############################################################################### def test_daas_getbuffer_jpeg2000_jp2kak(): _daas_getbuffer('JPEG2000', 'JP2KAK', ['QUALITY=100', 'CODEC=JP2'], 'image/jp2') ############################################################################### def test_daas_getbuffer_jpeg2000_jp2openjpeg(): _daas_getbuffer('JPEG2000', 'JP2OPENJPEG', ['QUALITY=100', 'REVERSIBLE=YES', 'RESOLUTIONS=1', 'CODEC=JP2'], 'image/jp2') ############################################################################### def test_daas_getbuffer_overview(): handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 1024, "height": 512, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "Byte" } ] }}}}}})) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) assert ds assert ds.GetRasterBand(1).GetOverviewCount() == 2 ovr0 = ds.GetRasterBand(1).GetOverview(0) assert ovr0.XSize == 512 assert ovr0.YSize == 256 handler = webserver.SequentialHandler() response = """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream %s --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":512,"height":256}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % (' ' * (512 * 256)) response = response.replace('\n', '\r\n') expected_body = """{ "bbox":{ "srs":{ "type":"image" }, "ul":{ "x":0, "y":0 }, "lr":{ "x":1024, "y":512 } }, "target-model":{ "step":{ "x":0, "y":0 }, "size":{ "columns":512, "lines":256 }, "sampling-algo":"NEAREST", "strictOutputSize":true, "srs":{ "type":"image" } }, "bands":[ "Band 1" ] }""".encode('ascii') handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response, expected_body=expected_body) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster(0, 0, 1024, 512, 512, 256) assert data ############################################################################### def test_daas_rasterio(): handler_metadata = webserver.SequentialHandler() handler_metadata.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 1024, "height": 512, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "Band 1", "pixelType": "UInt16" } ] }}}}}})) with webserver.install_http_handler(handler_metadata): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) assert ds handler = webserver.SequentialHandler() response = """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream %s --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":1024,"height":512}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % (' ' * (1024 * 512 * 2)) response = response.replace('\n', '\r\n') expected_body = """{ "bbox":{ "srs":{ "type":"image" }, "ul":{ "x":0, "y":0 }, "lr":{ "x":1024, "y":512 } }, "target-model":{ "step":{ "x":0, "y":0 }, "size":{ "columns":1024, "lines":512 }, "sampling-algo":"NEAREST", "strictOutputSize":true, "srs":{ "type":"image" } }, "bands":[ "Band 1" ] }""".encode('ascii') handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response, expected_body=expected_body) # Check that AdviseRead is properly honoured ds.AdviseRead(0, 0, 1024, 512) with webserver.install_http_handler(handler): data = ds.ReadRaster(0, 0, 512, 512) assert data data = ds.ReadRaster(0, 0, 512, 512) assert data data = ds.ReadRaster(512, 0, 512, 512) assert data # Redo at band level ds.FlushCache() ds.GetRasterBand(1).AdviseRead(0, 0, 1024, 512) handler.req_count = 0 with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) assert data # Re-test by simulating hitting server byte limit handler_metadata.req_count = 0 with webserver.install_http_handler(handler_metadata): with gdaltest.config_options( {'GDAL_DAAS_SERVER_BYTE_LIMIT': '%d' % (512 * 512), 'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) assert ds ds.GetRasterBand(1).AdviseRead(0, 0, 1024, 512) handler = webserver.SequentialHandler() response = """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream %s --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":512,"height":512}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % (' ' * (512 * 512 * 2)) response = response.replace('\n', '\r\n') expected_body = """{ "bbox":{ "srs":{ "type":"image" }, "ul":{ "x":0, "y":0 }, "lr":{ "x":512, "y":512 } }, "target-model":{ "step":{ "x":0, "y":0 }, "size":{ "columns":512, "lines":512 }, "sampling-algo":"NEAREST", "strictOutputSize":true, "srs":{ "type":"image" } }, "bands":[ "Band 1" ] }""".encode('ascii') handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response, expected_body=expected_body) handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster(0, 0, 1024, 512) assert data ############################################################################### def test_daas_mask(): # Valid JSon but invalid height (string) handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 3, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "geotransform": [2, 0, 0.1, 49, 0, -0.1], "bands": [ { "name": "PAN", "description": "Panchromatic band", "colorInterpretation": "GRAY", "pixelType": "UInt16" }, { "name": "THE_MASK", "colorInterpretation": "MAIN_MASK", "pixelType": "Byte" } ] }}}}}})) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port, open_options=['PIXEL_ENCODING=RAW']) assert ds.RasterCount == 1 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET assert ds.GetRasterBand(1).GetMaskBand() assert ds.GetRasterBand(1).GetNoDataValue() is None # Test a non-typical answer where the server returns a pixelType=Band for the PAN band # instead of UInt16 response = """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream %s --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":3,"bands":[{"name":"PAN","pixelType":"Byte"}]}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ('XXXXXX') response = response.replace('\n', '\r\n') response2 = """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: application/octet-stream %s --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":3,"bands":[{"name":"THE_MASK","pixelType":"Byte"}]}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""" % ('GHIJKL') response2 = response2.replace('\n', '\r\n') handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response) handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response2) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).GetMaskBand().ReadRaster(buf_type = gdal.GDT_Byte) assert data == 'GHIJKL'.encode('ascii') ds.FlushCache() handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response) handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, response2) with webserver.install_http_handler(handler): data = ds.ReadRaster(buf_type = gdal.GDT_Byte) assert data == 'XXXXXX'.encode('ascii') data = ds.GetRasterBand(1).GetMaskBand().ReadRaster(buf_type = gdal.GDT_Byte) assert data == 'GHIJKL'.encode('ascii') ############################################################################### def test_daas_png_response_4_bands_for_a_one_band_request(): # Valid JSon but invalid height (string) handler = webserver.SequentialHandler() handler.add('GET', '/daas/sensors/products/foo/images/bar', 200, {}, json.dumps({"response": {"payload": {"payload": {"imageMetadata": {"properties": { "width": 2, "height": 3, "_links": { "getBuffer": { "href": 'http://127.0.0.1:%d/getbuffer' % gdaltest.webserver_port } }, "bands": [ { "name": "PAN", "description": "Panchromatic band", "colorInterpretation": "GRAY", "pixelType": "Byte" } ] }}}}}})) with webserver.install_http_handler(handler): with gdaltest.config_options( {'GDAL_DAAS_PERFORM_AUTH': 'No', 'GDAL_DAAS_SERVICE_URL': 'http://127.0.0.1:%d/daas' % gdaltest.webserver_port}): ds = gdal.OpenEx("DAAS:http://127.0.0.1:%d/daas/sensors/products/foo/images/bar" % gdaltest.webserver_port) assert ds.RasterCount == 1 src_ds = gdal.GetDriverByName('MEM').Create('', 2, 3, 4) src_ds.GetRasterBand(1).WriteRaster( 0, 0, 2, 3, 'A', buf_xsize=1, buf_ysize=1) src_ds.GetRasterBand(2).WriteRaster( 0, 0, 2, 3, 'B', buf_xsize=1, buf_ysize=1) src_ds.GetRasterBand(3).WriteRaster( 0, 0, 2, 3, 'C', buf_xsize=1, buf_ysize=1) src_ds.GetRasterBand(4).WriteRaster( 0, 0, 2, 3, 'D', buf_xsize=1, buf_ysize=1) tmpfile = '/vsimem/out.png' gdal.GetDriverByName('PNG').CreateCopy(tmpfile, src_ds) f = gdal.VSIFOpenL(tmpfile, 'rb') png_content = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) gdal.Unlink(tmpfile) handler = webserver.SequentialHandler() handler.add('POST', '/getbuffer', 200, {'Content-Type': 'multipart/form-data; boundary=bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7'}, """--bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Data"; Content-Type: image/png """.replace('\n', '\r\n').encode('ascii') + png_content + """ --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7 Content-Disposition: form-data; name="Info"; Content-Type: application/json {"properties":{"format":"application/octet-stream","width":2,"height":3}} --bd3f250361b619a49ef290d4fdfcf5d5691e385e5a74254803befd5fe2a7--""".replace('\n', '\r\n').encode('ascii')) with webserver.install_http_handler(handler): data = ds.GetRasterBand(1).ReadRaster() assert data == 'AAAAAA'.encode('ascii') gdalautotest-3.2.2/gdrivers/arg.py0000775000175000017500000002214214020414366015650 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: arg.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: ARG Testing. # Author: David Zwarg # ############################################################################### # Copyright (c) 2012, David Zwarg # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import struct from copy import copy from osgeo import gdal import gdaltest import pytest # given fmt and nodata, encodes a value as bytes def pack(fmt, nodata, value): if value is None: value = nodata return struct.pack(fmt, value) # packs the given values together as bytes def encode(fmt, nodata, values): chunks = [pack(fmt, nodata, v) for v in values] return ''.encode('ascii').join(chunks) ############################################################################### # def test_arg_init(): gdaltest.argDriver = gdal.GetDriverByName('ARG') if gdaltest.argDriver is None: pytest.skip() gdaltest.argJsontpl = """{ "layer": "%(fmt)s", "type": "arg", "datatype": "%(dt)s", "xmin": %(xmin)f, "ymin": %(ymin)f, "xmax": %(xmax)f, "ymax": %(ymax)f, "cellwidth": %(width)f, "cellheight": %(height)f, "rows": %(rows)d, "cols": %(cols)d }""" gdaltest.argDefaults = { 'xmin': 0.0, 'ymin': 0.0, 'xmax': 2.0, 'ymax': 2.0, 'width': 1.0, 'height': 1.0, 'rows': 2, 'cols': 2 } # None means "no data" gdaltest.argTests = [ {'formats': [('int8', '>b', -(1 << 7)), ('int16', '>h', -(1 << 15)), ('int32', '>i', -(1 << 31)), ('int64', '>q', -(1 << 63))], 'data': [None, 2, -3, -4]}, {'formats': [('uint8', '>B', (1 << 8) - 1), ('uint16', '>H', (1 << 16) - 1), ('uint32', '>I', (1 << 32) - 1), ('uint64', '>Q', (1 << 64) - 1)], 'data': [None, 2, 3, 4]}, {'formats': [('float32', '>f', gdaltest.NaN()), ('float64', '>d', gdaltest.NaN())], 'data': [None, 1.1, -20.02, 300.003]}, ] for d in gdaltest.argTests: for (name, fmt, nodata) in d['formats']: arg = open('data/arg-' + name + '.arg', 'wb') arg.write(encode(fmt, nodata, d['data'])) arg.close() meta = copy(gdaltest.argDefaults) meta.update(fmt='arg-' + name, dt=name) json = open('data/arg-' + name + '.json', 'w') json.write(gdaltest.argJsontpl % meta) json.close() ds = gdal.Open('data/arg-' + gdaltest.argTests[0]['formats'][1][0] + '.arg') if ds is None: gdaltest.argDriver = None if gdaltest.argDriver is None: pytest.skip() def test_arg_unsupported(): if gdaltest.argDriver is None: pytest.skip() # int8 is unsupported for d in gdaltest.argTests: for (name, _, _) in d['formats']: if name == 'int64' or name == 'uint64': with gdaltest.error_handler('CPLQuietErrorHandler'): ds = gdal.Open('data/arg-' + name + '.arg') assert ds is None else: ds = gdal.Open('data/arg-' + name + '.arg') assert ds is not None def test_arg_getrastercount(): if gdaltest.argDriver is None: pytest.skip() for d in gdaltest.argTests: for (name, _, _) in d['formats']: with gdaltest.error_handler('CPLQuietErrorHandler'): ds = gdal.Open('data/arg-' + name + '.arg') if ds is None: continue assert ds.RasterCount == 1 def test_arg_getgeotransform(): if gdaltest.argDriver is None: pytest.skip() for d in gdaltest.argTests: for (name, _, _) in d['formats']: with gdaltest.error_handler('CPLQuietErrorHandler'): ds = gdal.Open('data/arg-' + name + '.arg') if ds is None: continue gt = ds.GetGeoTransform() assert (gt[0] == 0 and \ gt[1] == 1 and \ gt[2] == 0 and \ gt[3] == 2 and \ gt[4] == 0 and \ gt[5] == -1) def test_arg_blocksize(): if gdaltest.argDriver is None: pytest.skip() tifDriver = gdal.GetDriverByName('GTiff') assert tifDriver is not None ds = gdal.Open('data/utm.tif') xsize = ds.RasterXSize ysize = ds.RasterYSize # create a blocked tiff, where blocks don't line up evenly # with the image boundary ds2 = tifDriver.CreateCopy('data/utm-uneven-blocks.tif', ds, False, ['BLOCKXSIZE=25', 'BLOCKYSIZE=25', 'TILED=NO']) # convert the new blocked tiff to arg ds = gdaltest.argDriver.CreateCopy('data/utm.arg', ds2, False) ds2 = None ds = None stat = os.stat('data/utm.arg') os.remove('data/utm-uneven-blocks.tif') gdal.GetDriverByName('ARG').Delete('data/utm.arg') assert stat.st_size == (xsize * ysize) def test_arg_layername(): """ The layer name of the ARG in the .json file need not be the name of the .arg file. The original driver enforced this constraint, but that behavior was wrong. See ticket #4609 """ if gdaltest.argDriver is None: pytest.skip() ds = gdal.Open('data/arg-int16.arg') lyr = 'ARG FTW' # set the layer name ds.SetMetadataItem('LAYER', lyr) # did the layer name stick? assert ds.GetMetadata()['LAYER'] == lyr # copy the dataset to a new ARG ds2 = gdaltest.argDriver.CreateCopy('data/arg-int16-2.arg', ds, False) ds = None del ds2 # open the new dataset ds = gdal.Open('data/arg-int16-2.arg') lyr2 = ds.GetMetadata()['LAYER'] ds = None gdal.GetDriverByName('ARG').Delete('data/arg-int16-2.arg') # does the new dataset's layer match the layer set before copying assert lyr2 == lyr os.unlink('data/arg-int16.arg.aux.xml') def test_arg_nodata(): """ Check that the NoData value for int8 images is 128, as per the ARG spec. See ticket #4610 """ if gdaltest.argDriver is None: pytest.skip() ds = gdal.Open('data/arg-int8.arg') assert ds.GetRasterBand(1).GetNoDataValue() == 128 def test_arg_byteorder(): """ Check that a roundtrip from ARG -> GTiff -> ARG has the same binary values. See ticket #4779 Unfortunately, computing statistics yields different results when the binary data is the same. Compare them byte-by-byte. """ if gdaltest.argDriver is None: pytest.skip() tifDriver = gdal.GetDriverByName('GTiff') assert tifDriver is not None for d in gdaltest.argTests: for (name, _, _) in d['formats']: basename = 'data/arg-' + name with gdaltest.error_handler('CPLQuietErrorHandler'): orig = gdal.Open(basename + '.arg') if orig is None: continue dest = tifDriver.CreateCopy(basename + '.tif', orig, False) assert dest is not None mirror = gdaltest.argDriver.CreateCopy(basename + '2.arg', dest, False) assert mirror is not None orig = None dest = None mirror = None tmp1 = open(basename + '.arg', 'rb') tmp2 = open(basename + '2.arg', 'rb') data1 = tmp1.read() data2 = tmp2.read() tmp1.close() tmp2.close() gdal.GetDriverByName('GTiff').Delete(basename + '.tif') gdal.GetDriverByName('ARG').Delete(basename + '2.arg') assert data1 == data2 def test_arg_destroy(): if gdaltest.argDriver is None: pytest.skip() for d in gdaltest.argTests: for (name, _, _) in d['formats']: os.remove('data/arg-' + name + '.arg') os.remove('data/arg-' + name + '.json') gdalautotest-3.2.2/gdrivers/usgsdem.py0000775000175000017500000002302714020414366016551 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: usgsdem.py 71f92a8ef2b7cc5ed0fcb423bc93821df10fd52b 2020-05-10 14:37:42 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for USGSDEM driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal from osgeo import osr import gdaltest import pytest ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/022gdeme def test_usgsdem_1(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/022gdeme_truncated', 1, 1583) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') return tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/114p01_0100_deme.dem def test_usgsdem_2(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/114p01_0100_deme_truncated.dem', 1, 53864) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') return tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(-136.25010416667, 0.000208333, 0.0, 59.25010416667, 0.0, -0.000208333)) ############################################################################### # Test truncated version of file that triggered bug #2348 def test_usgsdem_3(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/39079G6_truncated.dem', 1, 61424) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS72') srs.SetUTM(17) return tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(606855.0, 30.0, 0.0, 4414605.0, 0.0, -30.0)) ############################################################################### # Test CreateCopy() def test_usgsdem_4(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/39079G6_truncated.dem', 1, 61424, options=['RESAMPLE=Nearest']) return tst.testCreateCopy(check_gt=1, check_srs=1, vsimem=1) ############################################################################### # Test CreateCopy() without any creation options def test_usgsdem_5(): ds = gdal.Open('data/n43.dt0') ds2 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/n43.dem', ds, options=['RESAMPLE=Nearest']) if ds.GetRasterBand(1).Checksum() != ds2.GetRasterBand(1).Checksum(): print(ds2.GetRasterBand(1).Checksum()) print(ds.GetRasterBand(1).Checksum()) ds2 = None print(open('tmp/n43.dem', 'rb').read()) pytest.fail('Bad checksum.') gt1 = ds.GetGeoTransform() gt2 = ds2.GetGeoTransform() for i in range(6): if gt1[i] != pytest.approx(gt2[i], abs=1e-5): print('') print('old = ', gt1) print('new = ', gt2) pytest.fail('Geotransform differs.') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') assert ds2.GetProjectionRef() == srs.ExportToWkt(), 'Bad SRS.' ds2 = None ############################################################################### # Test CreateCopy() without a few creation options. Then create a new copy with TEMPLATE # creation option and check that both files are binary identical. def test_usgsdem_6(): ds = gdal.Open('data/n43.dt0') ds2 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/file_1.dem', ds, options=['PRODUCER=GDAL', 'OriginCode=GDAL', 'ProcessCode=A', 'RESAMPLE=Nearest']) ds3 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/file_2.dem', ds2, options=['TEMPLATE=tmp/file_1.dem', 'RESAMPLE=Nearest']) del ds2 del ds3 f1 = open('tmp/file_1.dem', 'rb') f2 = open('tmp/file_2.dem', 'rb') # Skip the 40 first bytes because the dataset name will differ f1.seek(40, 0) f2.seek(40, 0) data1 = f1.read() data2 = f2.read() assert data1 == data2 f1.close() f2.close() ############################################################################### # Test CreateCopy() with CDED50K profile def test_usgsdem_7(): ds = gdal.Open('data/n43.dt0') # To avoid warning about 'Unable to find NTS mapsheet lookup file: NTS-50kindex.csv' gdal.PushErrorHandler('CPLQuietErrorHandler') ds2 = gdal.GetDriverByName('USGSDEM').CreateCopy('tmp/000a00DEMz', ds, options=['PRODUCT=CDED50K', 'TOPLEFT=80w,44n', 'RESAMPLE=Nearest', 'ZRESOLUTION=1.1', 'INTERNALNAME=GDAL']) gdal.PopErrorHandler() assert ds2.RasterXSize == 1201 and ds2.RasterYSize == 1201, 'Bad image dimensions.' expected_gt = (-80.000104166666674, 0.000208333333333, 0, 44.000104166666667, 0, -0.000208333333333) got_gt = ds2.GetGeoTransform() for i in range(6): if expected_gt[i] != pytest.approx(got_gt[i], abs=1e-5): print('') print('expected = ', expected_gt) print('got = ', got_gt) pytest.fail('Geotransform differs.') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD83') assert ds2.GetProjectionRef() == srs.ExportToWkt(), 'Bad SRS.' ds2 = None ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/various.zip/39109h1.dem # Undocumented format def test_usgsdem_8(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/39109h1_truncated.dem', 1, 39443) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') srs.SetUTM(12) return tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(660055.0, 10.0, 0.0, 4429465.0, 0.0, -10.0)) ############################################################################### # Test truncated version of http://download.osgeo.org/gdal/data/usgsdem/various.zip/4619old.dem # Old format def test_usgsdem_9(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/4619old_truncated.dem', 1, 10659) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') return tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(18.99958333, 0.0008333, 0.0, 47.000416667, 0.0, -0.0008333)) ############################################################################### # https://github.com/OSGeo/gdal/issues/583 def test_usgsdem_with_extra_values_at_end_of_profile(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/usgsdem_with_extra_values_at_end_of_profile.dem', 1, 56679) return tst.testOpen() ############################################################################### # Like Novato.dem of https://trac.osgeo.org/gdal/ticket/4901 def test_usgsdem_with_spaces_after_byte_864(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/usgsdem_with_spaces_after_byte_864.dem', 1, 61078) return tst.testOpen() ############################################################################### # Test truncated version of https://s3.amazonaws.com/data.tnris.org/8ea19b45-7a66-4e95-9833-f9e89611d106/resources/fema06-140cm-coastal_2995441_dem.zip # downloaded from https://data.tnris.org/collection/8ea19b45-7a66-4e95-9833-f9e89611d106 def test_usgsdem_with_header_of_918_bytes(): tst = gdaltest.GDALTest('USGSDEM', 'usgsdem/fema06-140cm_2995441b_truncated.dem', 1, 0) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD83') srs.SetUTM(15) with gdaltest.error_handler(): return tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(248500.0, 1.4, 0.0, 3252508.7, 0.0, -1.4)) ############################################################################### # Cleanup def test_usgsdem_cleanup(): try: os.remove('tmp/n43.dem') os.remove('tmp/n43.dem.aux.xml') os.remove('tmp/file_1.dem') os.remove('tmp/file_1.dem.aux.xml') os.remove('tmp/file_2.dem') os.remove('tmp/file_2.dem.aux.xml') os.remove('tmp/000a00DEMz') os.remove('tmp/000a00DEMz.aux.xml') except OSError: pass gdalautotest-3.2.2/gdrivers/vrtmultidim.py0000775000175000017500000011702114020414366017460 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: vrtmultidim.py 22a46c81ac01debe47445e0cd04d88f434aaa230 2019-09-02 23:44:51 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test multidimensional support in VRT driver # Author: Even Rouault # ############################################################################### # Copyright (c) 2019, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal from osgeo import osr import gdaltest import math import struct def test_vrtmultidim_dimension(): ds = gdal.OpenEx(""" """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert rg.GetName() == '/' dims = rg.GetDimensions() assert len(dims) == 2 dim_0 = dims[0] assert dim_0.GetName() == 'X' assert dim_0.GetSize() == 2 assert dim_0.GetType() == 'foo' assert dim_0.GetDirection() == 'bar' with gdaltest.error_handler(): gdal.ErrorReset() assert not dim_0.GetIndexingVariable() assert gdal.GetLastErrorMsg() == 'Cannot find variable X' dim_1 = dims[1] assert dim_1.GetName() == 'Y' assert dim_1.GetSize() == 1234567890123 with gdaltest.error_handler(): ds = gdal.OpenEx(""" """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" """, gdal.OF_MULTIDIM_RASTER) assert not ds def test_vrtmultidim_attribute(): ds = gdal.OpenEx(""" String bar baz Float64 1.25125 Float64 Float32 String bar """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() attrs = rg.GetAttributes() assert len(attrs) == 3 foo = next((x for x in attrs if x.GetName() == 'foo'), None) assert foo assert foo.GetDataType().GetClass() == gdal.GEDTC_STRING assert foo.Read() == ['bar', 'baz'] bar = next((x for x in attrs if x.GetName() == 'bar'), None) assert bar assert bar.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert bar.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert bar.Read() == 1.25125 empty = next((x for x in attrs if x.GetName() == 'empty'), None) assert empty assert empty.GetDataType().GetClass() == gdal.GEDTC_NUMERIC assert empty.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert empty.Read() == 0.0 ar = rg.OpenMDArray('ar') assert ar attrs = ar.GetAttributes() assert len(attrs) == 1 with gdaltest.error_handler(): ds = gdal.OpenEx(""" String bar """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" String bar """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" INVALID bar """, gdal.OF_MULTIDIM_RASTER) assert not ds def test_vrtmultidim_subgroup_and_cross_references(): ds = gdal.OpenEx(""" Float32 Float32 Float64 Float64 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg.GetGroupNames() == [ 'subgroup' ] subgroup = rg.OpenGroup('subgroup') assert subgroup dims = subgroup.GetDimensions() assert len(dims) == 2 dim_0 = dims[0] assert dim_0.GetName() == 'X' assert dim_0.GetSize() == 2 indexing_var = dim_0.GetIndexingVariable() assert indexing_var assert indexing_var.GetName() == 'X' assert indexing_var.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert indexing_var.GetDimensionCount() == 1 assert indexing_var.GetDimensions()[0].GetSize() == 2 dim_1 = dims[1] assert dim_1.GetName() == 'Y' assert dim_1.GetSize() == 3 indexing_var = dim_1.GetIndexingVariable() assert indexing_var assert indexing_var.GetName() == 'Y' assert indexing_var.GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert indexing_var.GetDimensionCount() == 1 assert indexing_var.GetDimensions()[0].GetSize() == 3 assert rg.GetMDArrayNames() == ['X', 'Y'] X = rg.OpenMDArray('X') assert X assert X.GetDataType().GetNumericDataType() == gdal.GDT_Float32 assert X.GetDimensionCount() == 1 assert X.GetDimensions()[0].GetSize() == 20 Y = rg.OpenMDArray('Y') assert Y assert Y.GetDataType().GetNumericDataType() == gdal.GDT_Float32 assert Y.GetDimensionCount() == 1 assert Y.GetDimensions()[0].GetSize() == 30 with gdaltest.error_handler(): ds = gdal.OpenEx(""" """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" invalid """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds def test_vrtmultidim_srs(): ds = gdal.OpenEx(""" Float64 EPSG:32632 Float64 EPSG:32632 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() X = rg.OpenMDArray('X') srs = X.GetSpatialRef() assert srs Y = rg.OpenMDArray('Y') srs = Y.GetSpatialRef() assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] def test_vrtmultidim_nodata_unit_offset_scale(): ds = gdal.OpenEx(""" Float64 foo 1.25125 1.5 2.5 Float64 nan Float64 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() ar = rg.OpenMDArray('ar1') assert ar.GetNoDataValueAsDouble() == 1.25125 assert struct.unpack('d', ar.Read()) == (1.25125,) assert ar.GetUnit() == 'foo' assert ar.GetOffset() == 1.5 assert ar.GetScale() == 2.5 ar = rg.OpenMDArray('ar2') assert math.isnan(ar.GetNoDataValueAsDouble()) assert math.isnan(struct.unpack('d', ar.Read())[0]) assert ar.GetOffset() is None assert ar.GetScale() is None ar = rg.OpenMDArray('ar3') assert ar.GetNoDataValueAsDouble() is None assert struct.unpack('d', ar.Read()) == (0,) def test_vrtmultidim_RegularlySpacedValues(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() X = rg.OpenMDArray('X') assert struct.unpack('d' * 4, X.Read()) == (0.5, 11.0, 21.5, 32.0) assert struct.unpack('d' * 2, X.Read(array_start_idx = [1], count = [2], array_step = [2] )) == (11.0, 32.0) with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 """, gdal.OF_MULTIDIM_RASTER) assert not ds def test_vrtmultidim_ConstantValue(): ds = gdal.OpenEx(""" Float64 5 10 100 Float64 50 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() ar = rg.OpenMDArray('ar') got = struct.unpack('d' * 12, ar.Read()) assert got == (5, 5, 5, 5, 10, 100, 5, 10, 100, 5, 10, 10) assert struct.unpack('d' * 4, ar.Read(array_start_idx = [2,1], count = [2,2] )) == (10,100,10,10) ar = rg.OpenMDArray('no_dim') assert struct.unpack('d', ar.Read()) == (50,) with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 10 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 10 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 10 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 10 """, gdal.OF_MULTIDIM_RASTER) assert not ds with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 10 """, gdal.OF_MULTIDIM_RASTER) assert not ds def test_vrtmultidim_InlineValues(): ds = gdal.OpenEx(""" Float64 0 1 2 3 4 5 6 7 8 9 10 11 -4 -5 -7 -8 -10 -11 100 101 Float64 50 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() ar = rg.OpenMDArray('ar') got = struct.unpack('d' * 12, ar.Read()) assert got == (0.0, 1.0, 2.0, 3.0, -4.0, 100.0, 6.0, -7.0, 101.0, 9.0, -10.0, -11.0) assert struct.unpack('d' * 4, ar.Read(array_start_idx = [2,1], count = [2,2] )) == (-7, 101, -10, -11) assert struct.unpack('d' * 4, ar.Read(array_start_idx = [2,1], count = [2,2], array_step=[-1,-1] )) == (-7, 6, -4, 3) ar = rg.OpenMDArray('no_dim') assert struct.unpack('d', ar.Read()) == (50,) with gdaltest.error_handler(): ds = gdal.OpenEx(""" Float64 10 """, gdal.OF_MULTIDIM_RASTER) assert not ds def test_vrtmultidim_Source(): def f(): gdal.FileFromMemBuffer('/vsimem/src.vrt',""" Float64 0 1 2 3 4 5 6 7 8 9 10 11 """) ds = gdal.OpenEx(""" Float64 /vsimem/src.vrt ar_source Float64 /vsimem/src.vrt ar_source Float64 /vsimem/src.vrt ar_source 1,0 Float64 /vsimem/src.vrt ar_source [::-1,...] Float64 /vsimem/non_existing.vrt ar_source Float64 /vsimem/non_existing.vrt ar_source Float64 /vsimem/src.vrt ar_source Float64 /vsimem/src.vrt ar_source [0] Float64 /vsimem/src.vrt non_existing_array_source Float64 /vsimem/src.vrt ar_source [100,...] Float64 /vsimem/src.vrt ar_source 1 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() ar = rg.OpenMDArray('ar') assert ar got = struct.unpack('d' * 12, ar.Read()) assert got == (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) ar_with_offset = rg.OpenMDArray('ar_with_offset') assert ar_with_offset got = struct.unpack('d' * 12, ar_with_offset.Read()) assert got == (0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 10, 11) assert struct.unpack('d' * 2, ar_with_offset.Read(array_start_idx = [2, 0], count = [1, 2])) == (0, 4) assert struct.unpack('d' * 2, ar_with_offset.Read(array_start_idx = [3, 1], count = [1, 2])) == (10, 11) assert struct.unpack('d' * 4, ar_with_offset.Read(array_start_idx = [2, 1], count = [2, 2], array_step=[-1,-1] )) == (4, 0, 0, 0) ar_transposed = rg.OpenMDArray('ar_transposed') assert ar_transposed got = struct.unpack('d' * 12, ar_transposed.Read()) assert got == (0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11) ar_view = rg.OpenMDArray('ar_view') assert ar_view got = struct.unpack('d' * 12, ar_view.Read()) assert got == (9, 10, 11, 6, 7, 8, 3, 4, 5, 0, 1, 2) # Source does not exist, but we don't request an area where it is active # so we should not try to open it ar = rg.OpenMDArray('ar_non_existing_source_with_offset') assert ar assert struct.unpack('d' * 2, ar.Read(array_start_idx = [0, 0], count = [1, 2])) == (0, 0) ar = rg.OpenMDArray('ar_non_existing_source') assert ar with gdaltest.error_handler(): assert not ar.Read() ar = rg.OpenMDArray('ar_invalid_source_slab_offset') assert ar with gdaltest.error_handler(): assert not ar.Read() ar = rg.OpenMDArray('ar_invalid_number_of_dimensions') assert ar with gdaltest.error_handler(): assert not ar.Read() ar = rg.OpenMDArray('ar_non_existing_array_source') assert ar with gdaltest.error_handler(): assert not ar.Read() ar = rg.OpenMDArray('ar_view_invalid') assert ar with gdaltest.error_handler(): assert not ar.Read() ar = rg.OpenMDArray('ar_transposed_invalid') assert ar with gdaltest.error_handler(): assert not ar.Read() gdal.Unlink('/vsimem/src.vrt') # Check that the cache is correctly working by opening a second # dataset after having remove the source ds2 = gdal.OpenEx(""" Float64 /vsimem/src.vrt ar_source """, gdal.OF_MULTIDIM_RASTER) assert ds2 rg2 = ds2.GetRootGroup() ar2 = rg2.OpenMDArray('ar') got = struct.unpack('d' * 12, ar2.Read()) assert got == (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) f() # Check that the cache is correctly working: we should get an error # now that all referencing arrays have been cleaned up ds2 = gdal.OpenEx(""" Float64 /vsimem/src.vrt ar_source """, gdal.OF_MULTIDIM_RASTER) assert ds2 rg2 = ds2.GetRootGroup() ar2 = rg2.OpenMDArray('ar') with gdaltest.error_handler(): assert not ar2.Read() def test_vrtmultidim_Source_classic_dataset(): ds = gdal.OpenEx(""" Float64 data/byte.tif 1 Float64 data/byte.tif 2 """, gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() ar = rg.OpenMDArray('ar') assert ar got = struct.unpack('d' * 12, ar.Read()) assert got == (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 132.0, 140.0, 0.0, 156.0, 132.0) ar_wrong_band = rg.OpenMDArray('ar_wrong_band') assert ar_wrong_band with gdaltest.error_handler(): assert not ar_wrong_band.Read() def _validate(content): try: from lxml import etree except ImportError: return doc = etree.XML(content) try: schema_content = open('../../gdal/data/gdalvrt.xsd', 'rb').read() except IOError: print('Cannot read gdalvrt.xsd schema') return schema = etree.XMLSchema(etree.XML(schema_content)) schema.assertValid(doc) def test_vrtmultidim_serialize(): tmpfile = '/vsimem/test.vrt' gdal.FileFromMemBuffer(tmpfile, """ Float64 Float64 data/byte.tif 1 foo the_array 1,0 [...] 15 0 1 2 3 4 5 6 7 8 9 10 11 Int32 1 String foo String foo bar baz Float64 """) ds = gdal.OpenEx(tmpfile, gdal.OF_MULTIDIM_RASTER | gdal.OF_UPDATE) rg = ds.GetRootGroup() ds = None attr = rg.CreateAttribute('foo', [], gdal.ExtendedDataType.CreateString()) attr.Write('bar') attr = None rg = None f = gdal.VSIFOpenL(tmpfile, 'rb') got_data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) #print(got_data) assert got_data == """ String bar Float64 Float64 data/byte.tif 1 foo the_array 1,0 [...] 15 0 1 2 3 4 5 6 7 8 9 10 11 Int32 1 String foo String foo bar baz Float64 """ _validate(got_data) gdal.Unlink(tmpfile) def test_vrtmultidim_createcopy(): src_ds = gdal.GetDriverByName('MEM').CreateMultiDimensional('myds') src_rg = src_ds.GetRootGroup() src_dim = src_rg.CreateDimension('dim', '', '', 3) src_ar = src_rg.CreateMDArray('array', [src_dim], gdal.ExtendedDataType.Create(gdal.GDT_Float64)) src_ar.Write(struct.pack('d' * 3, 1.5, 2.5, 3.5)) src_ar.SetNoDataValueDouble(1.5) src_ar.SetUnit('foo') src_ar.SetOffset(2.5) src_ar.SetScale(3.5) sr = osr.SpatialReference() sr.SetFromUserInput('ENGCRS["FOO",EDATUM["BAR"],CS[vertical,1],AXIS["foo",up,LENGTHUNIT["m",1]]]') sr.SetDataAxisToSRSAxisMapping([2, 1]) src_ar.SetSpatialRef(sr) attr = src_ar.CreateAttribute('foo', [], gdal.ExtendedDataType.CreateString()) attr.Write('bar') attr = None with gdaltest.error_handler(): gdal.GetDriverByName('VRT').CreateCopy('/i_do/not_exist', src_ds) tmpfile = '/vsimem/test.vrt' assert gdal.GetDriverByName('VRT').CreateCopy(tmpfile, src_ds) f = gdal.VSIFOpenL(tmpfile, 'rb') got_data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) #print(got_data) assert got_data == """ Float64 ENGCRS["FOO",EDATUM["BAR"],CS[vertical,1],AXIS["foo",up,LENGTHUNIT["m",1]]] foo 1.5 2.5 3.5 String bar """ _validate(got_data) gdal.Unlink(tmpfile) def test_vrtmultidim_createmultidimensional(): tmpfile = '/vsimem/test.vrt' ds = gdal.GetDriverByName('VRT').CreateMultiDimensional(tmpfile) rg = ds.GetRootGroup() ds_other = gdal.GetDriverByName('VRT').CreateMultiDimensional('') dim_other = ds_other.GetRootGroup().CreateDimension('dim', '', '', 4) dim = rg.CreateDimension('dim', '', '', 3) assert dim with gdaltest.error_handler(): assert not rg.CreateDimension('', '', '', 1) assert not rg.CreateDimension('dim', '', '', 1) assert rg.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) with gdaltest.error_handler(): assert not rg.CreateAttribute('', [1], gdal.ExtendedDataType.CreateString()) assert not rg.CreateAttribute('attr_2dim', [1,2], gdal.ExtendedDataType.CreateString()) assert not rg.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) assert not rg.CreateAttribute('attr_too_big', [4000 * 1000 * 1000], gdal.ExtendedDataType.CreateString()) ar = rg.CreateMDArray('ar', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert ar[0] with gdaltest.error_handler(): assert not rg.CreateMDArray('', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert not rg.CreateMDArray('ar', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert not rg.CreateMDArray('ar2', [dim_other], gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert ar.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) with gdaltest.error_handler(): assert not ar.CreateAttribute('', [1], gdal.ExtendedDataType.CreateString()) assert not ar.CreateAttribute('attr', [1], gdal.ExtendedDataType.CreateString()) subg = rg.CreateGroup('subgroup') assert subg with gdaltest.error_handler(): assert not rg.CreateGroup('subgroup') assert not rg.CreateGroup('') ds.FlushCache() f = gdal.VSIFOpenL(tmpfile, 'rb') got_data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) #print(got_data) assert got_data == """ String Float32 String """ _validate(got_data) gdal.Unlink(tmpfile) gdalautotest-3.2.2/gdrivers/sgi.py0000775000175000017500000000435014020414366015662 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: sgi.py 97b1f917921f064dd9533945550707913889a7a2 2020-05-10 17:59:02 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: PNM (Portable Anyware Map) Testing. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Read existing simple 1 band SGI file. def test_sgi_1(): tst = gdaltest.GDALTest('SGI', 'sgi/byte.sgi', 1, 4672) return tst.testOpen() ############################################################################### # Write Test grayscale def test_sgi_2(): tst = gdaltest.GDALTest('SGI', 'byte.tif', 1, 4672) return tst.testCreate() ############################################################################### # Write Test rgb def test_sgi_3(): tst = gdaltest.GDALTest('SGI', 'rgbsmall.tif', 2, 21053) return tst.testCreate() gdalautotest-3.2.2/gdrivers/ilwis.py0000775000175000017500000001024314020414366016225 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ilwis.py f1b948260a71bfacad979faf9ca87bf93e198bc9 2020-05-10 13:09:26 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ILWIS format driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Perform simple read test. def test_ilwis_1(): tst = gdaltest.GDALTest('ilwis', 'ilwis/LanduseSmall.mpr', 1, 2351) srs = """PROJCS["UTM", GEOGCS["PSAD56", DATUM["Provisional_South_American_Datum_1956", SPHEROID["International 1924",6378388,297, AUTHORITY["EPSG","7022"]], AUTHORITY["EPSG","6248"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4248"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-69], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",10000000], UNIT["Meter",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" gt = (795480, 20, 0, 8090520, 0, -20) return tst.testOpen(check_gt=gt, check_prj=srs) ############################################################################### # copy byte data and verify. def test_ilwis_2(): tst = gdaltest.GDALTest('ilwis', 'byte.tif', 1, 4672) return tst.testCreateCopy(check_srs=1, check_gt=1, new_filename='tmp/byte.mpr') ############################################################################### # copy floating point data and use Create interface. def test_ilwis_3(): tst = gdaltest.GDALTest('ilwis', 'hfa/float.img', 1, 23529) return tst.testCreate(new_filename='tmp/float.mpr', out_bands=1) ############################################################################### # Try multi band dataset. def test_ilwis_4(): tst = gdaltest.GDALTest('ilwis', 'rgbsmall.tif', 2, 21053) return tst.testCreate(new_filename='tmp/rgb.mpl', check_minmax=0, out_bands=3) ############################################################################### # Test vsi in-memory support. def test_ilwis_5(): tst = gdaltest.GDALTest('ilwis', 'byte.tif', 1, 4672) return tst.testCreateCopy(check_srs=1, check_gt=1, vsimem=1, new_filename='/vsimem/ilwis/byte.mpr') ############################################################################### # Cleanup. # # Currently the ILWIS driver does not keep track of the files that are # part of the dataset properly, so we can't automatically clean them up # properly. So we do the brute force approach... def test_ilwis_cleanup(): gdaltest.clean_tmp() gdalautotest-3.2.2/gdrivers/pds.py0000775000175000017500000004276514020414366015702 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: pds.py 6134153c291c8a2c426288882ec951d21d7c19ea 2020-05-10 13:00:59 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for PDS driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal from osgeo import osr import gdaltest import pytest ############################################################################### # Read a truncated and modified version of http://download.osgeo.org/gdal/data/pds/mc02.img def test_pds_1(): tst = gdaltest.GDALTest('PDS', 'pds/mc02_truncated.img', 1, 47151) expected_prj = """PROJCS["SIMPLE_CYLINDRICAL MARS",GEOGCS["GCS_MARS",DATUM["D_MARS",SPHEROID[""MARS"",3396000,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],PARAMETER["pseudo_standard_parallel_1",0],UNIT["metre",1]]""" expected_gt = (-10668384.903788566589355, 926.115274429321289, 0, 3852176.483988761901855, 0, -926.115274429321289) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') tst.testOpen(check_prj=expected_prj, check_gt=expected_gt) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) ############################################################################### # Read a truncated and modified version of ftp://pdsimage2.wr.usgs.gov/cdroms/magellan/mg_1103/fl78n018/fl73n003.img def test_pds_2(): tst = gdaltest.GDALTest('PDS', 'pds/fl73n003_truncated.img', 1, 34962) expected_prj = """PROJCS["SINUSOIDAL VENUS", GEOGCS["GCS_VENUS", DATUM["D_VENUS", SPHEROID["VENUS",6051000,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Sinusoidal"], PARAMETER["longitude_of_center",18], PARAMETER["false_easting",0], PARAMETER["false_northing",0],UNIT["metre",1]]""" expected_gt = (587861.55900404998, 75.000002980232239, 0.0, -7815243.4746123618, 0.0, -75.000002980232239) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') tst.testOpen(check_prj=expected_prj, check_gt=expected_gt) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) ds = gdal.Open('data/pds/fl73n003_truncated.img') assert ds.GetRasterBand(1).GetNoDataValue() == 7 assert ds.GetRasterBand(1).GetScale() == 0.2 assert ds.GetRasterBand(1).GetOffset() == -20.2 # Per #3939 we would also like to test a dataset with MISSING_CONSTANT. ds = gdal.Open('data/pds/fl73n003_alt_truncated.img') assert ds.GetRasterBand(1).GetNoDataValue() == 7 ############################################################################### # Read a truncated and modified version of ftp://pdsimage2.wr.usgs.gov/cdroms/messenger/MSGRMDS_1001/DATA/2004_232/EN0001426030M.IMG # 16bits image def test_pds_3(): # Shut down warning about missing projection gdal.PushErrorHandler('CPLQuietErrorHandler') tst = gdaltest.GDALTest('PDS', 'pds/EN0001426030M_truncated.IMG', 1, 1367) gt_expected = (0, 1, 0, 0, 0, 1) tst.testOpen(check_gt=gt_expected) ds = gdal.Open('data/pds/EN0001426030M_truncated.IMG') assert ds.GetRasterBand(1).GetNoDataValue() == 0 gdal.PopErrorHandler() ############################################################################### # Read a hacked example of reading a detached file with an offset #3177. def test_pds_4(): tst = gdaltest.GDALTest('PDS', 'pds/pds_3177.lbl', 1, 3418) gt_expected = (6119184.3590369327, 1.0113804322107001, 0.0, -549696.39009125973, 0.0, -1.0113804322107001) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') tst.testOpen(check_gt=gt_expected) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) ############################################################################### # Read a hacked example of reading a detached file with an offset #3355. def test_pds_5(): tst = gdaltest.GDALTest('PDS', 'pds/pds_3355.lbl', 1, 2748) return tst.testOpen() ############################################################################### # Read an image via the PDS label. This is a distinct mode of the PDS # driver mostly intended to support jpeg2000 files with PDS labels. def test_pds_6(): if os.path.exists('data/byte.tif.aux.xml'): os.unlink('data/byte.tif.aux.xml') tst = gdaltest.GDALTest('PDS', 'pds/ESP_013951_1955_RED.LBL', 1, 4672) gt_expected = (-6139197.5, 0.5, 0.0, 936003.0, 0.0, -0.5) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') tst.testOpen(check_gt=gt_expected) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) ds = gdal.Open('data/pds/ESP_013951_1955_RED.LBL') assert len(ds.GetFileList()) == 2, 'failed to get expected file list.' expected_wkt = 'PROJCS["EQUIRECTANGULAR MARS",GEOGCS["GCS_MARS",DATUM["D_MARS",SPHEROID["MARS_localRadius",3394839.8133163,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Equirectangular"],PARAMETER["standard_parallel_1",15],PARAMETER["central_meridian",180],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' wkt = ds.GetProjection() if expected_wkt != wkt: print('Got: ', wkt) print('Exp: ', expected_wkt) pytest.fail('did not get expected coordinate system.') ############################################################################### # Read an uncompressed image via the PDS label. (#3943) def test_pds_7(): tst = gdaltest.GDALTest('PDS', 'pds/LDEM_4.LBL', 1, 50938, 0, 0, 1440, 2) gt_expected = (-5450622.3254203796, 7580.8377265930176, 0.0, 2721520.7438468933, 0.0, -7580.8377265930176) prj_expected = """PROJCS["SIMPLE_CYLINDRICAL MOON", GEOGCS["GCS_MOON", DATUM["D_MOON", SPHEROID["MOON",1737400,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Equirectangular"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",180], PARAMETER["standard_parallel_1",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0],UNIT["metre",1]]""" gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '-0.5') gdal.SetConfigOption('PDS_LineProjOffset_Shift', '-0.5') tst.testOpen(check_prj=prj_expected, check_gt=gt_expected) gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) ############################################################################### # Test applying adjustment offsets via configuration variables for the # geotransform (#3940) def test_pds_8(): # values for MAGELLAN FMAP data. gdal.SetConfigOption('PDS_SampleProjOffset_Shift', '1.5') gdal.SetConfigOption('PDS_LineProjOffset_Shift', '1.5') gdal.SetConfigOption('PDS_SampleProjOffset_Mult', '1.0') gdal.SetConfigOption('PDS_LineProjOffset_Mult', '-1.0') tst = gdaltest.GDALTest('PDS', 'pds/mc02_truncated.img', 1, 47151) expected_gt = (10670237.134337425, 926.11527442932129, 0.0, -3854028.7145376205, 0.0, -926.11527442932129) result = tst.testOpen(check_gt=expected_gt) # clear config settings gdal.SetConfigOption('PDS_SampleProjOffset_Shift', None) gdal.SetConfigOption('PDS_LineProjOffset_Shift', None) gdal.SetConfigOption('PDS_SampleProjOffset_Mult', None) gdal.SetConfigOption('PDS_LineProjOffset_Mult', None) return result ############################################################################### # Test a PDS with an image compressed in a ZIP, and with nodata expressed as # an hexadecimal floating point value (#3939) def test_pds_9(): # Derived from http://pdsimage.wr.usgs.gov/data/co-v_e_j_s-radar-3-sbdr-v1.0/CORADR_0035/DATA/BIDR/BIEQI49N071_D035_T00AS01_V02.LBL tst = gdaltest.GDALTest('PDS', 'pds/PDS_WITH_ZIP_IMG.LBL', 1, 0) tst.testOpen() ds = gdal.Open('data/pds/PDS_WITH_ZIP_IMG.LBL') got_nd = ds.GetRasterBand(1).GetNoDataValue() expected_nd = -3.40282265508890445e+38 assert abs((got_nd - expected_nd) / expected_nd) <= 1e-5 assert ds.GetProjectionRef() ############################################################################### # Test PDS label with nested arrays (#6970) def test_pds_10(): gdal.FileFromMemBuffer('/vsimem/pds_10', """PDS_VERSION_ID = "PDS3" DATA_FORMAT = "PDS" ^IMAGE = 1 # Non sensical but just to parse nested arrays NOTE = ((1, 2, 3)) PRODUCT_ID = ({1, 2}, {3,4}) OBJECT = IMAGE BANDS = 1 BAND_STORAGE_TYPE = "BAND SEQUENTIAL" LINES = 1 LINE_SAMPLES = 1 SAMPLE_BITS = 8 END_OBJECT = IMAGE END """) ds = gdal.Open('/vsimem/pds_10') assert ds.GetMetadataItem('NOTE') == '((1,2,3))' assert ds.GetMetadataItem('PRODUCT_ID') == '({1,2},{3,4})', \ ds.GetMetadataItem('NOTE') gdal.FileFromMemBuffer('/vsimem/pds_10', """PDS_VERSION_ID = "PDS3" # Unpaired NOTE = (x, y} END """) with gdaltest.error_handler(): gdal.Open('/vsimem/pds_10') gdal.FileFromMemBuffer('/vsimem/pds_10', """PDS_VERSION_ID = "PDS3" # Unpaired NOTE = {x, y) END """) with gdaltest.error_handler(): gdal.Open('/vsimem/pds_10') gdal.Unlink('/vsimem/pds_10') ############################################################################### # Read a hacked example of reading an image where the line offset is not # a multiple of the record size # https://github.com/OSGeo/gdal/issues/955 def test_pds_line_offset_not_multiple_of_record(): tst = gdaltest.GDALTest('PDS', 'pds/map_000_038_truncated.lbl', 1, 14019) return tst.testOpen() ############################################################################### # Read http://pds-geosciences.wustl.edu/mro/mro-m-crism-3-rdr-targeted-v1/mrocr_2104/trdr/2010/2010_095/hsp00017ba0/hsp00017ba0_01_ra218s_trr3.lbl # Test ability of using OBJECT = FILE section to support CRISM # as well as BAND_STORAGE_TYPE = LINE_INTERLEAVED def test_pds_band_storage_type_line_interleaved(): tst = gdaltest.GDALTest('PDS', 'pds/hsp00017ba0_01_ra218s_trr3_truncated.lbl', 1, 64740) return tst.testOpen() def test_pds_oblique_cylindrical_read(): # This dataset is a champion in its category. It features: # - POSITIVE_LONGITUDE_DIRECTION = WEST # - MAP_PROJECTION_ROTATION = 90.0 # - oblique cylindrical projection # https://pds-imaging.jpl.nasa.gov/data/cassini/cassini_orbiter/CORADR_0101_V03/DATA/BIDR/BIBQH03N123_D101_T020S03_V03.LBL ds = gdal.Open('data/pds/BIBQH03N123_D101_T020S03_V03_truncated.IMG') srs = ds.GetSpatialRef() assert srs.ExportToProj4() == '+proj=ob_tran +R=2575000 +o_proj=eqc +o_lon_p=-257.744003 +o_lat_p=120.374532 +lon_0=-303.571748 +wktext +no_defs' gt = ds.GetGeoTransform() assert gt == pytest.approx((-5347774.07796, 0, 351.11116, -2561707.02336, 351.11116, 0)) geog_srs = srs.CloneGeogCS() ct = osr.CoordinateTransformation(srs, geog_srs) def to_lon_lat(pixel, line): x = gt[0] + pixel * gt[1] + line * gt[2] y = gt[3] + pixel * gt[4] + line * gt[5] lon, lat, _ = ct.TransformPoint(x, y) return lon, lat # Check consistency of the corners of the image with the long,lat bounds # in the metadata # MAXIMUM_LATITUDE = 32.37062573 # MINIMUM_LATITUDE = -31.41702033 # EASTERNMOST_LONGITUDE = 75.792673220 # WESTERNMOST_LONGITUDE = 169.8235459 _, lat = to_lon_lat(0, 0) assert lat == pytest.approx(-31.097321393323572) # MINIMUM_LATITUDE lon, _ = to_lon_lat(ds.RasterXSize, 0) assert lon == pytest.approx(-169.8290961385244) # WESTERNMOST_LONGITUDE * -1 _, lat = to_lon_lat(0, ds.RasterYSize) assert lat == pytest.approx(-31.421452666874025) # MINIMUM_LATITUDE lon, _ = to_lon_lat(ds.RasterXSize, ds.RasterYSize) assert lon == pytest.approx(-75.787124149033) # EASTERNMOST_LONGITUDE * -1 ############################################################################### def test_pds_sharp_on_continuing_line(): gdal.FileFromMemBuffer('/vsimem/test', """PDS_VERSION_ID = "PDS3" NOTE = (#9933FF, #FFFF33) ^IMAGE = 1 OBJECT = IMAGE BANDS = 1 BAND_STORAGE_TYPE = "BAND SEQUENTIAL" LINES = 1 LINE_SAMPLES = 1 SAMPLE_BITS = 8 END_OBJECT = IMAGE END """) ds = gdal.Open('/vsimem/test') assert ds.GetMetadataItem('NOTE') == '(#9933FF,#FFFF33)' gdal.Unlink('/vsimem/test') ############################################################################### def test_pds_sharp_comma_continuing_line(): gdal.FileFromMemBuffer('/vsimem/test', """PDS_VERSION_ID = "PDS3" NOTE = ("a" ,"b") ^IMAGE = 1 OBJECT = IMAGE BANDS = 1 BAND_STORAGE_TYPE = "BAND SEQUENTIAL" LINES = 1 LINE_SAMPLES = 1 SAMPLE_BITS = 8 END_OBJECT = IMAGE END """) ds = gdal.Open('/vsimem/test') assert ds.GetMetadataItem('NOTE') == '("a","b")' gdal.Unlink('/vsimem/test') ############################################################################### # Test reading a Mercator_2SP dataset (#2490) def test_pds_mercator_2SP(): # Dataset from https://sbnarchive.psi.edu/pds3/dawn/fc/DWNCLCFC2_2/DATA/CE_LAMO_Q_00N_036E_MER_CLR.IMG ds = gdal.Open('data/pds/CE_LAMO_Q_00N_036E_MER_CLR_truncated.IMG') expected_wkt = """PROJCRS["MERCATOR 1_CERES", BASEGEOGCRS["GCS_1_CERES", DATUM["D_1_CERES", ELLIPSOID["1_CERES",470000,0, LENGTHUNIT["metre",1, ID["EPSG",9001]]]], PRIMEM["Reference_Meridian",0, ANGLEUNIT["degree",0.0174532925199433, ID["EPSG",9122]]]], CONVERSION["unnamed", METHOD["Mercator (variant B)", ID["EPSG",9805]], PARAMETER["Latitude of 1st standard parallel",-12.99, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8823]], PARAMETER["Longitude of natural origin",36, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["False easting",0, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",0, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["easting",east, ORDER[1], LENGTHUNIT["metre",1, ID["EPSG",9001]]], AXIS["northing",north, ORDER[2], LENGTHUNIT["metre",1, ID["EPSG",9001]]]]""" expected_srs = osr.SpatialReference() expected_srs.ImportFromWkt(expected_wkt) srs = ds.GetSpatialRef() assert srs.IsSame(expected_srs), srs.ExportToWkt() gdalautotest-3.2.2/gdrivers/rik.py0000775000175000017500000000632214020414366015666 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: rik.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: RIK Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2009-2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Test a RIK map # Data downloaded from : http://www.lantmateriet.se/upload/filer/kartor/programvaror/sverige500_swe99.zip def test_rik_online_1(): if gdal.GetDriverByName('RIK') is None: pytest.skip() if not gdaltest.download_file('http://www.lantmateriet.se/upload/filer/kartor/programvaror/sverige500_swe99.zip', 'sverige500_swe99.zip'): pytest.skip() try: os.stat('tmp/cache/sverige500_swe99.rik') file_to_test = 'tmp/cache/sverige500_swe99.rik' except OSError: try: print('Uncompressing ZIP file...') import zipfile zfobj = zipfile.ZipFile('tmp/cache/sverige500_swe99.zip') outfile = open('tmp/cache/sverige500_swe99.rik', 'wb') outfile.write(zfobj.read('sverige500_swe99.rik')) outfile.close() file_to_test = 'tmp/cache/sverige500_swe99.rik' except OSError: pytest.skip() tst = gdaltest.GDALTest('RIK', file_to_test, 1, 17162, filename_absolute=1) return tst.testOpen() ############################################################################### # Test a LZW compressed RIK dataset def test_rik_online_2(): if gdal.GetDriverByName('RIK') is None: pytest.skip() if not gdaltest.download_file('http://trac.osgeo.org/gdal/raw-attachment/ticket/3674/ab-del.rik', 'ab-del.rik'): pytest.skip() tst = gdaltest.GDALTest('RIK', 'tmp/cache/ab-del.rik', 1, 44974, filename_absolute=1) return tst.testOpen() gdalautotest-3.2.2/gdrivers/rs2.py0000775000175000017500000000626514020414366015615 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: rs2.py 1dc2d9612ca97c54f22a90ea8da251b6c626d738 2020-05-10 16:51:27 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test RS2 driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Test reading a - fake - RS2 dataset. Note: the XML file was written by studying # the code of the driver. It is really not meant as being used by other readers. If RS2 code # evolves, this might break the test legitimately ! def test_rs2_1(): tst = gdaltest.GDALTest('RS2', 'rs2/product.xml', 1, 4672) return tst.testOpen() def test_rs2_2(): tst = gdaltest.GDALTest('RS2', 'RADARSAT_2_CALIB:BETA0:data/rs2/product.xml', 1, 4848, filename_absolute=1) return tst.testOpen() # Test reading our dummy RPC def test_rs2_3(): ds = gdal.Open('data/rs2/product.xml') got_rpc = ds.GetMetadata('RPC') expected_rpc = {'ERR_BIAS': 'biasError', 'ERR_RAND': 'randomError', 'HEIGHT_OFF': 'heightOffset', 'HEIGHT_SCALE': 'heightScale', 'LAT_OFF': 'latitudeOffset', 'LAT_SCALE': 'latitudeScale', 'LINE_DEN_COEFF': 'lineDenominatorCoefficients', 'LINE_NUM_COEFF': 'lineNumeratorCoefficients', 'LINE_OFF': 'lineOffset', 'LINE_SCALE': 'lineScale', 'LONG_OFF': 'longitudeOffset', 'LONG_SCALE': 'longitudeScale', 'SAMP_DEN_COEFF': 'pixelDenominatorCoefficients', 'SAMP_NUM_COEFF': 'pixelNumeratorCoefficients', 'SAMP_OFF': 'pixelOffset', 'SAMP_SCALE': 'pixelScale'} assert got_rpc == expected_rpc gdalautotest-3.2.2/gdrivers/grib.py0000775000175000017500000021503414020414366016026 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: grib.py 03f6d5b0798194def1a13280f3932d57ec1a53c8 2021-01-14 20:02:12 +0100 Nicolas GUILLIER $ # # Project: GDAL/OGR Test Suite # Purpose: Test GRIB driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # Copyright (c) 2008-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import struct import shutil from osgeo import gdal from osgeo import osr import pytest import gdaltest pytestmark = pytest.mark.require_driver('GRIB') def has_jp2kdrv(): for i in range(gdal.GetDriverCount()): if gdal.GetDriver(i).ShortName.startswith('JP2'): return True return False ############################################################################### # Do a simple checksum on our test file def test_grib_1(): tst = gdaltest.GDALTest('GRIB', 'grib/ds.mint.bin', 2, 46927) return tst.testOpen() ############################################################################### # Test a small GRIB 1 sample file. def test_grib_2(): tst = gdaltest.GDALTest('GRIB', 'grib/Sample_QuikSCAT.grb', 4, 50714) tst.testOpen() ds = gdal.Open('data/grib/Sample_QuikSCAT.grb') assert ds.GetRasterBand(1).GetNoDataValue() == 9999.0 assert ds.GetRasterBand(1).GetNoDataValue() == 9999.0 # do it again to test correct caching ############################################################################### # This file has different raster sizes for some of the products, which # we sort-of-support per ticket Test a small GRIB 1 sample file. def test_grib_read_different_sizes_messages(): tst = gdaltest.GDALTest('GRIB', 'grib/bug3246.grb', 4, 4081) gdal.PushErrorHandler('CPLQuietErrorHandler') result = tst.testOpen() gdal.PopErrorHandler() msg = gdal.GetLastErrorMsg() if msg.find('data access may be incomplete') == -1 \ or gdal.GetLastErrorType() != 2: gdaltest.post_reason('did not get expected warning.') return result ############################################################################### # Check nodata def test_grib_grib2_read_nodata(): ds = gdal.Open('data/grib/ds.mint.bin') assert ds.GetRasterBand(1).GetNoDataValue() == 9999 assert ds.GetRasterBand(2).GetNoDataValue() == 9999 md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_REF_TIME': ' 1203613200 sec UTC', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '0 5 2 0 0 255 255 1 19 1 0 0 255 -1 -2147483647 2008 2 22 12 0 0 1 0 3 255 1 12 1 0', 'GRIB_VALID_TIME': ' 1203681600 sec UTC', 'GRIB_FORECAST_SECONDS': '68400 sec', 'GRIB_UNIT': '[C]', 'GRIB_PDS_TEMPLATE_NUMBERS': '0 5 2 0 0 0 255 255 1 0 0 0 19 1 0 0 0 0 0 255 129 255 255 255 255 7 216 2 22 12 0 0 1 0 0 0 0 3 255 1 0 0 0 12 1 0 0 0 0', 'GRIB_DISCIPLINE': '0(Meteorological)', 'GRIB_PDS_PDTN': '8', 'GRIB_COMMENT': 'Minimum temperature [C]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'MinT'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ############################################################################### # Check grib units (#3606) def test_grib_read_units(): gdal.Unlink('tmp/ds.mint.bin.aux.xml') shutil.copy('data/grib/ds.mint.bin', 'tmp/ds.mint.bin') ds = gdal.Open('tmp/ds.mint.bin') md = ds.GetRasterBand(1).GetMetadata() assert md['GRIB_UNIT'] == '[C]' assert md['GRIB_COMMENT'] == 'Minimum temperature [C]' ds.GetRasterBand(1).ComputeStatistics(False) assert ds.GetRasterBand(1).GetMinimum() == pytest.approx(13, abs=1) ds = None os.unlink('tmp/ds.mint.bin.aux.xml') with gdaltest.config_option('GRIB_NORMALIZE_UNITS', 'NO'): ds = gdal.Open('tmp/ds.mint.bin') ds.GetRasterBand(1).ComputeStatistics(False) md = ds.GetRasterBand(1).GetMetadata() assert md['GRIB_UNIT'] == '[K]' assert md['GRIB_COMMENT'] == 'Minimum temperature [K]' assert ds.GetRasterBand(1).GetMinimum() == pytest.approx(286, abs=1) ds = None gdal.GetDriverByName('GRIB').Delete('tmp/ds.mint.bin') ############################################################################### # Handle geotransform for 1xn or nx1 grids. The geotransform was faulty when # grib files had one cell in either direction for geographic projections. See # ticket #5532 def test_grib_read_geotransform_one_n_or_n_one(): ds = gdal.Open('data/grib/one_one.grib2') egt = (-114.25, 0.5, 0.0, 47.250, 0.0, -0.5) gt = ds.GetGeoTransform() ds = None assert gt == egt ############################################################################### # This is more a /vsizip/ file test than a GRIB one, but could not easily # come up with a pure /vsizip/ test case, so here's a real world use # case (#5530). def test_grib_read_vsizip(): ds = gdal.Open('/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03') assert ds is not None ############################################################################### # Write PDS numbers to all bands def test_grib_grib2_test_grib_pds_all_bands(): ds = gdal.Open('/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03') assert ds is not None band = ds.GetRasterBand(2) md = band.GetMetadataItem('GRIB_PDS_TEMPLATE_NUMBERS') ds = None assert md is not None, 'Failed to fetch pds numbers (#5144)' with gdaltest.config_option('GRIB_PDS_ALL_BANDS', 'OFF'): ds = gdal.Open('/vsizip/data/grib/gfs.t00z.mastergrb2f03.zip/gfs.t00z.mastergrb2f03') assert ds is not None band = ds.GetRasterBand(2) md = band.GetMetadataItem('GRIB_PDS_TEMPLATE_NUMBERS') ds = None assert md is None, 'Got pds numbers, when disabled (#5144)' ############################################################################### # Test support for template 4.15 (#5768) def test_grib_grib2_read_template_4_15(): import test_cli_utilities if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' data/grib/template_4_15.grb2 -checksum') # This is a JPEG2000 compressed file, so just check we can open it or that we get a message saying there's no JPEG2000 driver available assert 'Checksum=' in ret or 'Is the JPEG2000 driver available?' in err, \ 'Could not open file' ############################################################################### # Test support for PNG compressed def test_grib_grib2_read_png(): if gdal.GetDriverByName('PNG') is None: pytest.skip() ds = gdal.Open('data/grib/MRMS_EchoTop_18_00.50_20161015-133230.grib2') cs = ds.GetRasterBand(1).Checksum() assert cs == 41854, 'Could not open file' ############################################################################### # Test support for GRIB2 Section 4 Template 32, Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for synthetic satellite data. def test_grib_grib2_read_template_4_32(): # First band extracted from http://nomads.ncep.noaa.gov/pub/data/nccf/com/hur/prod/hwrf.2017102006/twenty-se27w.2017102006.hwrfsat.core.0p02.f000.grb2 ds = gdal.Open('data/grib/twenty-se27w.2017102006.hwrfsat.core.0p02.f000_truncated.grb2') cs = ds.GetRasterBand(1).Checksum() assert cs == 48230, 'Could not open file' assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx((-9.765,2.415), 1e-3) # Reasonable range for Celcius md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_REF_TIME': ' 1508479200 sec UTC', 'GRIB_VALID_TIME': ' 1508479200 sec UTC', 'GRIB_FORECAST_SECONDS': '0 sec', 'GRIB_UNIT': '[C]', 'GRIB_PDS_TEMPLATE_NUMBERS': '5 7 2 0 0 0 0 0 1 0 0 0 0 1 0 31 1 29 67 140 2 0 0 238 217', 'GRIB_PDS_PDTN': '32', 'GRIB_COMMENT': 'Brightness Temperature [C]', 'GRIB_SHORT_NAME': '0 undefined', 'GRIB_ELEMENT': 'BRTEMP', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 1 31 285 17292 2 61145'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ############################################################################### # GRIB2 file with all 0 data def test_grib_grib2_read_all_zero_data(): # From http://dd.weather.gc.ca/model_wave/great_lakes/erie/grib2/00/CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P000.grib2 ds = gdal.Open('data/grib/CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P000.grib2') cs = ds.GetRasterBand(1).Checksum() assert cs == 0, 'Could not open file' md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_REF_TIME': ' 1510963200 sec UTC', 'GRIB_VALID_TIME': ' 1510963200 sec UTC', 'GRIB_FORECAST_SECONDS': '0 sec', 'GRIB_UNIT': '[Proportion]', 'GRIB_PDS_TEMPLATE_NUMBERS': '2 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 255 255 255 255 255 255', 'GRIB_PDS_PDTN': '0', 'GRIB_COMMENT': 'Ice cover [Proportion]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'ICEC'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ############################################################################### # GRIB1 file with rotate pole lonlat def test_grib_grib1_read_rotated_pole_lonlat(): ds = gdal.Open('/vsisparse/data/grib/rotated_pole.grb.xml') assert ds.RasterXSize == 726 and ds.RasterYSize == 550, \ 'Did not get expected dimensions' assert ds.GetRasterBand(1).GetNoDataValue() is None assert ds.GetRasterBand(1).GetNoDataValue() is None # do it again to test correct caching projection = ds.GetProjectionRef() expected_projection_proj_7 = 'GEOGCRS["Coordinate System imported from GRIB file",BASEGEOGCRS["Coordinate System imported from GRIB file",DATUM["unnamed",ELLIPSOID["Sphere",6367470,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (GRIB convention)",METHOD["Pole rotation (GRIB convention)"],PARAMETER["Latitude of the southern pole (GRIB convention)",-30,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Longitude of the southern pole (GRIB convention)",-15,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Axis rotation (GRIB convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]' expected_projection_before_proj_7 = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Sphere",6367470,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Rotated_pole"],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=ob_tran +lon_0=-15 +o_proj=longlat +o_lon_p=0 +o_lat_p=30 +a=6367470 +b=6367470 +to_meter=0.0174532925199 +wktext"]]' assert projection in (expected_projection_proj_7, expected_projection_before_proj_7), projection if projection == expected_projection_proj_7: assert ds.GetSpatialRef().IsDerivedGeographic() gt = ds.GetGeoTransform() expected_gt = (-30.25, 0.1, 0.0, 24.15, 0.0, -0.1) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_REF_TIME': ' 1503295200 sec UTC', 'GRIB_VALID_TIME': ' 1503295200 sec UTC', 'GRIB_FORECAST_SECONDS': '0 sec', 'GRIB_UNIT': '[m^2/s^2]', 'GRIB_COMMENT': 'Geopotential [m^2/s^2]', 'GRIB_SHORT_NAME': '0-HTGL', 'GRIB_ELEMENT': 'GP'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ############################################################################### # GRIB2 file with rotate pole lonlat def test_grib_grib2_read_rotated_pole_lonlat(): ds = gdal.Open('/vsisparse/data/grib/rotated_pole.grb2.xml') assert ds.RasterXSize == 1102 and ds.RasterYSize == 1076 projection = ds.GetProjectionRef() expected_projection_proj_7 = 'GEOGCRS["Coordinate System imported from GRIB file",BASEGEOGCRS["Coordinate System imported from GRIB file",DATUM["unnamed",ELLIPSOID["Sphere",6371229,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],DERIVINGCONVERSION["Pole rotation (GRIB convention)",METHOD["Pole rotation (GRIB convention)"],PARAMETER["Latitude of the southern pole (GRIB convention)",-31.758312,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Longitude of the southern pole (GRIB convention)",-92.402969,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Axis rotation (GRIB convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]' expected_projection_before_proj_7 = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Sphere",6371229,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Rotated_pole"],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=ob_tran +lon_0=-92.4029689999999846 +o_proj=longlat +o_lon_p=0 +o_lat_p=31.7583120000000001 +a=6371229 +b=6371229 +to_meter=0.0174532925199 +wktext"]]' assert projection in (expected_projection_proj_7, expected_projection_before_proj_7), projection gt = ds.GetGeoTransform() expected_gt = (-62.6222310049955, 0.09000000999091741, 0.0, 48.28500200186046, 0.0, -0.09000000372093023) assert gt == pytest.approx(expected_gt, 1e-3) ############################################################################### # Test support for GRIB2 Section 4 Template 40, Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents def test_grib_grib2_read_template_4_40(): # We could use some other encoding that JP2K... if not has_jp2kdrv(): pytest.skip() # First band extracted from https://download.regional.atmosphere.copernicus.eu/services/CAMS50?token=__M0bChV6QsoOFqHz31VRqnpr4GhWPtcpaRy3oeZjBNSg__&grid=0.1&model=ENSEMBLE&package=ANALYSIS_PM10_SURFACE&time=-24H-1H&referencetime=2017-09-12T00:00:00Z&format=GRIB2&licence=yes # with data nullified ds = gdal.Open('data/grib/template_4_40.grb2') md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_REF_TIME': ' 1505088000 sec UTC', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647', 'GRIB_VALID_TIME': ' 1505088000 sec UTC', 'GRIB_FORECAST_SECONDS': '0 sec', 'GRIB_UNIT': '[kg/(m^3)]', 'GRIB_PDS_TEMPLATE_NUMBERS': '20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255', 'GRIB_PDS_PDTN': '40', 'GRIB_COMMENT': 'Mass Density (Concentration) [kg/(m^3)]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'MASSDEN'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ############################################################################### # Test support for a unhandled GRIB2 Section 4 Template def test_grib_grib2_read_template_4_unhandled(): with gdaltest.error_handler(): ds = gdal.Open('data/grib/template_4_65535.grb2') md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_TEMPLATE_NUMBERS': '0 1 2 3 4 5', 'GRIB_PDS_PDTN': '65535'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ############################################################################### # Test reading GRIB2 Transverse Mercator grid def test_grib_grib2_read_transverse_mercator(): ds = gdal.Open('data/grib/transverse_mercator.grb2') projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Sphere",6367470,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" assert projection == expected_projection, 'Did not get expected projection' gt = ds.GetGeoTransform() expected_gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # Test reading GRIB2 Mercator grid def test_grib_grib2_read_mercator(): ds = gdal.Open('data/grib/mercator.grb2') projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" assert projection == expected_projection, 'Did not get expected projection' gt = ds.GetGeoTransform() expected_gt = (-13095853.598139772, 72.237, 0.0, 3991876.4600486886, 0.0, -72.237) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # Test reading GRIB2 Mercator grid def test_grib_grib2_read_mercator_2sp(): ds = gdal.Open('data/grib/mercator_2sp.grb2') projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",33.5],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" assert projection == expected_projection, 'Did not get expected projection' gt = ds.GetGeoTransform() expected_gt = (-10931598.94836207, 60.299, 0.0, 3332168.629121481, 0.0, -60.299) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # Test reading GRIB2 Lambert Conformal Conic grid def test_grib_grib2_read_lcc(): ds = gdal.Open('data/grib/lambert_conformal_conic.grb2') projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",33.5],PARAMETER["central_meridian",117],PARAMETER["standard_parallel_1",33],PARAMETER["standard_parallel_2",34],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" assert projection == expected_projection, 'Did not get expected projection' gt = ds.GetGeoTransform() expected_gt = (8974734.737685828, 60.021, 0.0, 6235918.9698001575, 0.0, -60.021) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # Test reading GRIB2 Polar Stereographic grid def test_grib_grib2_read_polar_stereo(): ds = gdal.Open('data/grib/polar_stereographic.grb2') projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",60],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",SOUTH],AXIS["Northing",SOUTH]]""" assert projection == expected_projection, 'Did not get expected projection' gt = ds.GetGeoTransform() expected_gt = (-5621962.072511509, 71.86, 0.0, 2943991.8007649644, 0.0, -71.86) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # Test reading GRIB2 Albers Equal Area grid def test_grib_grib2_read_aea(): ds = gdal.Open('data/grib/albers_equal_area.grb2') projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",33.5],PARAMETER["longitude_of_center",117],PARAMETER["standard_parallel_1",33],PARAMETER["standard_parallel_2",34],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" assert projection == expected_projection, 'Did not get expected projection' gt = ds.GetGeoTransform() expected_gt = (8974979.714292033, 60.022, 0.0, 6235686.52464211, 0.0, -60.022) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # Test reading GRIB2 Lambert Azimuthal Equal Area grid def test_grib_grib2_read_laea(): ds = gdal.Open('data/grib/lambert_azimuthal_equal_area.grb2') projection = ds.GetProjectionRef() expected_projection = """PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["latitude_of_center",33.5],PARAMETER["longitude_of_center",243],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" assert projection == expected_projection, 'Did not get expected projection' gt = ds.GetGeoTransform() expected_gt = (-59384.01063035424, 60.021, 0.0, 44812.5792223211, 0.0, -60.021) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # Test reading GRIB2 with Grid point data - IEEE Floating Point Data (template 5.4) def test_grib_grib2_read_template_5_4_grid_point_ieee_floating_point(): ds = gdal.Open('data/grib/ieee754_single.grb2') cs = ds.GetRasterBand(1).Checksum() assert cs == 4727, 'Did not get expected checksum' ds = gdal.Open('data/grib/ieee754_double.grb2') cs = ds.GetRasterBand(1).Checksum() assert cs == 4727, 'Did not get expected checksum' ############################################################################### # Test reading GRIB2 with NBITS=0 and DECIMAL_SCALE !=0 def test_grib_grib2_read_section_5_nbits_zero_decimal_scaled(): ds = gdal.Open('data/grib/simple_packing_nbits_zero_decimal_scaled.grb2') cs = ds.GetRasterBand(1).Checksum() assert cs == 5, 'Did not get expected checksum' if gdal.GetDriverByName('PNG') is not None: ds = gdal.Open('data/grib/png_nbits_zero_decimal_scaled.grb2') cs = ds.GetRasterBand(1).Checksum() assert cs == 5, 'Did not get expected checksum' if has_jp2kdrv(): ds = gdal.Open('data/grib/jpeg2000_nbits_zero_decimal_scaled.grb2') cs = ds.GetRasterBand(1).Checksum() assert cs == 5, 'Did not get expected checksum' ############################################################################### # Test reading GRIB2 with complex packing and spatial differencing of order 1 def test_grib_grib2_read_spatial_differencing_order_1(): ds = gdal.Open('data/grib/spatial_differencing_order_1.grb2') cs = ds.GetRasterBand(1).Checksum() if cs != 46650: gdaltest.post_reason('Did not get expected checksum') print(cs) ############################################################################### # Test GRIB2 creation options def test_grib_grib2_write_creation_options(): tmpfilename = '/vsimem/out.grb2' gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "DISCIPLINE=1", "IDS=CENTER=85(Toulouse) SUBCENTER=2 MASTER_TABLE=5 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=2017-09-11T12:34:56Z PROD_STATUS=2(Research) TYPE=0(Analysis)", "IDS_SUBCENTER=3", # Test that it overrides IDS "PDS_PDTN=30", "BAND_1_PDS_PDTN=40", # Test that it overrides PDS_PDTN "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255" ]) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_IDS': 'CENTER=85(Toulouse) SUBCENTER=3 MASTER_TABLE=5 LOCAL_TABLE=0 SIGNF_REF_TIME=0(Analysis) REF_TIME=2017-09-11T12:34:56Z PROD_STATUS=2(Research) TYPE=0(Analysis)', 'GRIB_PDS_TEMPLATE_NUMBERS': '20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255', 'GRIB_DISCIPLINE': '1(Hydrological)', 'GRIB_PDS_PDTN': '40'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_NUMBERS and more elements than needed (warning) with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=40", "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255 0extra" ]) assert out_ds is not None out_ds = None ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_PDTN': '40', 'GRIB_PDS_TEMPLATE_NUMBERS': '20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255 0'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES and insufficient number of elements with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=40", "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255" ]) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=40", "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647" ]) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_PDTN': '40', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES and more elements than needed (warning) with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=40", "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647 0extra" ]) assert out_ds is not None out_ds = None ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_PDTN': '40', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES and insufficient number of elements with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=40", "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127" ]) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES with variable number of elements gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=32", "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145" ]) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_PDTN': '32', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES with variable number of elements, and insufficient number of elements in the variable section with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=32", "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2" ]) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_ASSEMBLED_VALUES with variable number of elements, and extra elements with gdaltest.error_handler(): gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=32", "PDS_TEMPLATE_ASSEMBLED_VALUES=5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145 0extra" ]) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_PDTN': '32', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with PDS_TEMPLATE_NUMBERS with variable number of elements gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=32", "PDS_TEMPLATE_NUMBERS=5 7 2 0 0 0 0 0 1 0 0 0 0 2 0 31 1 29 67 140 2 0 0 238 217 0 31 1 29 67 140 2 0 0 238 217" ]) ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_PDTN': '32', 'GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES': '5 7 2 0 0 0 0 1 0 2 31 285 17292 2 61145 31 285 17292 2 61145'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with unknown PDS_PDTN with PDS_TEMPLATE_NUMBERS with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=65535", "PDS_TEMPLATE_NUMBERS=1 2 3 4 5" ]) assert out_ds is not None out_ds = None with gdaltest.error_handler(): ds = gdal.Open(tmpfilename) md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_PDS_PDTN': '65535', 'GRIB_PDS_TEMPLATE_NUMBERS': '1 2 3 4 5'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ds = None gdal.Unlink(tmpfilename) # Test with unknown PDS_PDTN with PDS_TEMPLATE_ASSEMBLED_VALUES with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=65535", "PDS_TEMPLATE_ASSEMBLED_VALUES=1 2 3 4 5" ]) assert out_ds is None gdal.Unlink(tmpfilename) # Test with PDS_PDTN != 0 without template numbers with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=32" ]) assert out_ds is None gdal.Unlink(tmpfilename) # Test with invalid values in PDS_TEMPLATE_NUMBERS with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=254", "PDS_TEMPLATE_NUMBERS=-1 256 0 0 0 0" ]) assert out_ds is not None out_ds = None gdal.Unlink(tmpfilename) # Test with invalid values in PDS_TEMPLATE_ASSEMBLED_VALUES with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=44", # {44,21,0, {1, 1, 2,1,-1, -4, -1,-4,1,1,1, 2, 1,1,-2 ,1,-1, -4,1,-1,-4} }, "PDS_TEMPLATE_ASSEMBLED_VALUES=-1 256 -1 1 128 4000000000 -1 -4 1 1 1 65536 1 1 32768 1 -129 -4 1 -1 -4" ]) assert out_ds is not None out_ds = None gdal.Unlink(tmpfilename) # Test with both PDS_TEMPLATE_NUMBERS and PDS_TEMPLATE_ASSEMBLED_VALUES with gdaltest.error_handler(): out_ds = gdal.Translate(tmpfilename, 'data/byte.tif', format='GRIB', creationOptions=[ "PDS_PDTN=40", "PDS_TEMPLATE_NUMBERS=20 0 156 72 0 255 99 0 0 0 1 0 0 0 0 1 255 255 255 255 255 255 255 255 255 255 255", "PDS_TEMPLATE_ASSEMBLED_VALUES=20 0 40008 0 255 99 0 0 1 0 1 -127 -2147483647 255 -127 -2147483647" ]) assert out_ds is None gdal.Unlink(tmpfilename) ############################################################################### # Test GRIB2 write support for projections def test_grib_grib2_write_projections(): filenames = ['albers_equal_area.grb2', 'lambert_azimuthal_equal_area.grb2', 'lambert_conformal_conic.grb2', 'mercator.grb2', 'mercator_2sp.grb2', 'polar_stereographic.grb2', 'ieee754_single.grb2' # Longitude latitude ] for filename in filenames: filename = 'data/grib/' + filename src_ds = gdal.Open(filename) tmpfilename = '/vsimem/out.grb2' gdal.Translate(tmpfilename, filename, format='GRIB') out_ds = gdal.Open(tmpfilename) assert src_ds.GetProjectionRef() == out_ds.GetProjectionRef(), \ ('did not get expected projection for %s' % filename) expected_gt = src_ds.GetGeoTransform() got_gt = out_ds.GetGeoTransform() assert max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5, \ ('did not get expected geotransform for %s' % filename) out_ds = None gdal.Unlink(tmpfilename) # Test writing GRS80 src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, gdal.GDT_Float32) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) src_ds.SetProjection("""GEOGCS["GRS 1980(IUGG, 1980)", DATUM["unknown", SPHEROID["GRS80",6378137,298.257222101]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""") tmpfilename = '/vsimem/out.grb2' out_ds = gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds) wkt = out_ds.GetProjectionRef() out_ds = None gdal.Unlink(tmpfilename) assert 'SPHEROID["GRS80",6378137,298.257222101]' in wkt # Test writing Mercator_1SP with scale != 1 (will be read as Mercator_2SP) src_ds = gdal.Warp('', 'data/byte.tif', format='MEM', dstSRS="""PROJCS["unnamed", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4267"]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.8347374126019634], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""") tmpfilename = '/vsimem/out.grb2' gdal.Translate(tmpfilename, src_ds, format='GRIB') out_ds = gdal.Open(tmpfilename) expected_wkt = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Spheroid imported from GRIB file",6378206.4,294.978698213911]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",33.500986],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' got_sr = osr.SpatialReference() got_sr.SetFromUserInput(out_ds.GetProjectionRef()) expected_sr = osr.SpatialReference() expected_sr.SetFromUserInput(expected_wkt) if got_sr.IsSame(expected_sr) == 0: print(out_ds.GetProjectionRef()) pytest.fail('did not get expected projection for Mercator_1SP') expected_gt = (-10931635.565066436, 60.297, 0.0, 3331982.221608528, 0.0, -60.297) got_gt = out_ds.GetGeoTransform() assert max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5, \ 'did not get expected geotransform for Mercator_1SP' out_ds = None gdal.Unlink(tmpfilename) # Test writing LCC_1SP (will be read as LCC_2SP) src_ds = gdal.Warp('', 'data/byte.tif', format='MEM', dstSRS="""PROJCS["unnamed", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4267"]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",33.5], PARAMETER["central_meridian",117], PARAMETER["scale_factor",0.9999], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1]]""") tmpfilename = '/vsimem/out.grb2' gdal.Translate(tmpfilename, src_ds, format='GRIB') out_ds = gdal.Open(tmpfilename) expected_wkt = 'PROJCS["unnamed",GEOGCS["Coordinate System imported from GRIB file",DATUM["unnamed",SPHEROID["Spheroid imported from GRIB file",6378206.4,294.978698213911]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",33.5],PARAMETER["central_meridian",117],PARAMETER["standard_parallel_1",34.310911],PARAMETER["standard_parallel_2",32.686501],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' got_sr = osr.SpatialReference() got_sr.SetFromUserInput(out_ds.GetProjectionRef()) expected_sr = osr.SpatialReference() expected_sr.SetFromUserInput(expected_wkt) if got_sr.IsSame(expected_sr) == 0: print(out_ds.GetProjectionRef()) pytest.fail('did not get expected projection for LCC_1SP') expected_gt = (8974472.884926716, 60.017, 0.0, 6235685.688523474, 0.0, -60.017) got_gt = out_ds.GetGeoTransform() assert max([abs(expected_gt[i] - got_gt[i]) for i in range(6)]) <= 1e-5, \ 'did not get expected geotransform for LCC_1SP' out_ds = None gdal.Unlink(tmpfilename) ############################################################################### def _grib_read_section(filename, sect_num_to_read): f = gdal.VSIFOpenL(filename, 'rb') if f is None: return None # Ignore Sect 0 gdal.VSIFReadL(1, 16, f) ret = None while True: sect_size_bytes = gdal.VSIFReadL(1, 4, f) if not sect_size_bytes: break sect_size_num = struct.unpack('>I', sect_size_bytes)[0] sect_num_bytes = gdal.VSIFReadL(1, 1, f) sect_num = ord(sect_num_bytes) if sect_num == sect_num_to_read: ret = sect_size_bytes + sect_num_bytes + gdal.VSIFReadL(1, sect_size_num - 5, f) break gdal.VSIFSeekL(f, sect_size_num - 5, 1) gdal.VSIFCloseL(f) return ret ############################################################################### # Test GRIB2 write support for data encodings def test_grib_grib2_write_data_encodings(): # Template 5 numbers GS5_SIMPLE = 0 GS5_CMPLX = 2 GS5_CMPLXSEC = 3 GS5_IEEE = 4 GS5_JPEG2000 = 40 GS5_PNG = 41 tests = [] tests += [['data/byte.tif', [], 4672, GS5_SIMPLE]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING'], 4672, GS5_SIMPLE]] tests += [['data/byte.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT'], 4672, GS5_IEEE]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=8'], 4672, GS5_SIMPLE]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=9'], 4672, GS5_SIMPLE]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=7'], 4484, GS5_SIMPLE]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_SIMPLE]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=5', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_SIMPLE]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'NBITS=8', 'DECIMAL_SCALE_FACTOR=-1'], 4855, GS5_SIMPLE]] tests += [['data/grib/ds.mint.bin', ['PDS_PDTN=8', 'PDS_TEMPLATE_ASSEMBLED_VALUES=0 5 2 0 0 255 255 1 19 1 0 0 255 -1 -2147483647 2008 2 22 12 0 0 1 0 3 255 1 12 1 0'], 46650, GS5_CMPLX]] # has nodata, hence complex packing tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING'], 4672, GS5_CMPLX]] tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'SPATIAL_DIFFERENCING_ORDER=0'], 4672, GS5_CMPLX]] tests += [['data/byte.tif', ['SPATIAL_DIFFERENCING_ORDER=1'], 4672, GS5_CMPLXSEC]] tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'SPATIAL_DIFFERENCING_ORDER=1'], 4672, GS5_CMPLXSEC]] tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'SPATIAL_DIFFERENCING_ORDER=2'], 4672, GS5_CMPLXSEC]] tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_CMPLX]] tests += [['data/byte.tif', ['DATA_ENCODING=COMPLEX_PACKING', 'NBITS=7'], 4484, GS5_CMPLX]] if gdal.GetDriverByName('PNG') is not None: tests += [['data/byte.tif', ['DATA_ENCODING=PNG'], 4672, GS5_PNG]] tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=8'], 4672, GS5_PNG]] tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'DECIMAL_SCALE_FACTOR=-1'], 4820, GS5_PNG]] tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=8', 'DECIMAL_SCALE_FACTOR=-1'], 4855, GS5_PNG]] tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=9'], 4672, GS5_PNG]] # rounded to 16 bit tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=7'], 4672, GS5_PNG]] # rounded to 8 bit tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=4'], 5103, GS5_PNG]] tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=3'], 5103, GS5_PNG]] # rounded to 4 bit tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=2'], 5103, GS5_PNG]] tests += [['data/byte.tif', ['DATA_ENCODING=PNG', 'NBITS=1'], 5103, GS5_PNG]] tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=PNG'], 4672, GS5_PNG]] found_j2k_drivers = [] for drvname in ['JP2KAK', 'JP2OPENJPEG', 'JPEG2000', 'JP2ECW']: if gdal.GetDriverByName(drvname) is not None: if drvname != 'JP2ECW': found_j2k_drivers.append(drvname) else: import ecw if ecw.has_write_support(): found_j2k_drivers.append(drvname) if found_j2k_drivers: tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000'], 4672, GS5_JPEG2000]] tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'COMPRESSION_RATIO=2'], 4672, GS5_JPEG2000]] # COMPRESSION_RATIO ignored in that case tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=8'], 4672, GS5_JPEG2000]] tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'DECIMAL_SCALE_FACTOR=-1'], (4820, 4722), GS5_JPEG2000]] tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=8', 'DECIMAL_SCALE_FACTOR=-1'], (4855, 4795), GS5_JPEG2000]] tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=9'], 4672, GS5_JPEG2000]] # 4899 for JP2ECW, 4440 for JP2OPENJPEG tests += [['data/byte.tif', ['DATA_ENCODING=JPEG2000', 'NBITS=7'], (4484, 4899, 4440), GS5_JPEG2000]] for drvname in found_j2k_drivers: tests += [['data/byte.tif', ['JPEG2000_DRIVER=' + drvname], 4672, GS5_JPEG2000]] tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=JPEG2000'], 4672, GS5_JPEG2000]] tests += [['../gcore/data/int16.tif', [], 4672, GS5_SIMPLE]] tests += [['../gcore/data/uint16.tif', [], 4672, GS5_SIMPLE]] tests += [['../gcore/data/int32.tif', [], 4672, GS5_SIMPLE]] tests += [['../gcore/data/uint32.tif', [], 4672, GS5_SIMPLE]] tests += [['../gcore/data/float32.tif', [], 4672, GS5_IEEE]] tests += [['../gcore/data/float64.tif', [], 4672, GS5_IEEE]] tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT'], 4672, GS5_IEEE]] tests += [['../gcore/data/float64.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT'], 4672, GS5_IEEE]] tests += [['../gcore/data/float32.tif', ['DATA_ENCODING=COMPLEX_PACKING'], 4672, GS5_CMPLX]] one_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) one_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') one_ds.SetProjection(sr.ExportToWkt()) one_ds.GetRasterBand(1).Fill(1) tests += [[one_ds, [], 1, GS5_SIMPLE]] tests += [[one_ds, ['DATA_ENCODING=COMPLEX_PACKING'], 1, GS5_CMPLX]] if gdal.GetDriverByName('PNG') is not None: tests += [[one_ds, ['DATA_ENCODING=PNG'], 1, GS5_PNG]] if found_j2k_drivers: tests += [[one_ds, ['DATA_ENCODING=JPEG2000'], 1, GS5_JPEG2000]] nodata_never_hit_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) nodata_never_hit_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) nodata_never_hit_ds.SetProjection(sr.ExportToWkt()) nodata_never_hit_ds.GetRasterBand(1).SetNoDataValue(1) tests += [[nodata_never_hit_ds, [], 0, GS5_SIMPLE]] all_nodata_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) all_nodata_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) all_nodata_ds.SetProjection(sr.ExportToWkt()) all_nodata_ds.GetRasterBand(1).SetNoDataValue(0) tests += [[all_nodata_ds, ['DATA_ENCODING=COMPLEX_PACKING'], 0, GS5_CMPLX]] for (filename, options, expected_cs, expected_section5_template_number) in tests: tmpfilename = '/vsimem/out.grb2' gdal.ErrorReset() gdal.Translate(tmpfilename, filename, format='GRIB', creationOptions=options) error_msg = gdal.GetLastErrorMsg() assert error_msg == '', \ ('did not expect error for %s, %s' % (str(filename), str(options))) section5 = _grib_read_section(tmpfilename, 5) section5_template_number = struct.unpack('>h', section5[9:11])[0] assert section5_template_number == expected_section5_template_number, \ ('did not get expected section 5 template number for %s, %s' % (str(filename), str(options))) out_ds = gdal.Open(tmpfilename) cs = out_ds.GetRasterBand(1).Checksum() nd = out_ds.GetRasterBand(1).GetNoDataValue() out_ds = None gdal.Unlink(tmpfilename) if not isinstance(expected_cs, tuple): expected_cs = (expected_cs,) assert cs in expected_cs, \ ('did not get expected checksum for %s, %s' % (str(filename), str(options))) if section5_template_number in (GS5_CMPLX, GS5_CMPLXSEC): if isinstance(filename, str): ref_ds = gdal.Open(filename) else: ref_ds = filename expected_nd = ref_ds.GetRasterBand(1).GetNoDataValue() assert nd == expected_nd, \ ('did not get expected nodata for %s, %s' % (str(filename), str(options))) # Test floating point data with dynamic < 1 test_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, gdal.GDT_Float32) test_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) test_ds.SetProjection(sr.ExportToWkt()) test_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * 'f', 1.23, 1.45, 1.56, 1.78)) encodings = ['SIMPLE_PACKING', 'COMPLEX_PACKING', 'IEEE_FLOATING_POINT'] if gdal.GetDriverByName('PNG') is not None: encodings += ['PNG'] # JPEG2000 doesn't result in an appropriate result if found_j2k_drivers and found_j2k_drivers != ['JPEG2000'] and found_j2k_drivers != ['JPEG2000', 'JP2ECW']: encodings += ['JPEG2000'] for encoding in encodings: tmpfilename = '/vsimem/out.grb2' gdal.ErrorReset() options = ['DATA_ENCODING=' + encoding] if encoding == 'COMPLEX_PACKING': with gdaltest.error_handler(): success = gdal.Translate(tmpfilename, test_ds, format='GRIB', creationOptions=options) assert not success, \ ('expected error for %s, %s' % ('floating point data with dynamic < 1', str(options))) else: gdal.Translate(tmpfilename, test_ds, format='GRIB', creationOptions=options) error_msg = gdal.GetLastErrorMsg() assert error_msg == '', \ ('did not expect error for %s, %s' % ('floating point data with dynamic < 1', str(options))) out_ds = gdal.Open(tmpfilename) got_vals = struct.unpack(4 * 'd', out_ds.ReadRaster()) out_ds = None if encoding == 'IEEE_FLOATING_POINT': expected_vals = (1.23, 1.45, 1.56, 1.78) else: expected_vals = (1.2300000190734863, 1.4487500190734863, 1.5581250190734863, 1.7807812690734863) assert max([abs(got_vals[i] - expected_vals[i]) for i in range(4)]) <= 1e-7, \ 'did not get expected values' gdal.Unlink(tmpfilename) test_ds = None # Test floating point data with very large dynamic test_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, gdal.GDT_Float32) test_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) test_ds.SetProjection(sr.ExportToWkt()) test_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * 'f', 1.23e10, -2.45e10, 1.23e10, -2.45e10)) encodings = ['SIMPLE_PACKING'] if gdal.GetDriverByName('PNG') is not None: encodings += ['PNG'] # JP2ECW doesn't manage to compress such a small file if found_j2k_drivers and found_j2k_drivers != ['JP2ECW'] and found_j2k_drivers != ['JPEG2000', 'JP2ECW']: encodings += ['JPEG2000'] for encoding in encodings: tmpfilename = '/vsimem/out.grb2' if encoding != 'SIMPLE_PACKING': gdal.PushErrorHandler() gdal.Translate(tmpfilename, test_ds, format='GRIB', creationOptions=['DATA_ENCODING=' + encoding]) if encoding != 'SIMPLE_PACKING': gdal.PopErrorHandler() out_ds = gdal.Open(tmpfilename) assert out_ds is not None, ('failed to re-open dataset for ' + encoding) got_vals = struct.unpack(4 * 'd', out_ds.ReadRaster()) out_ds = None gdal.Unlink(tmpfilename) expected_vals = (1.23e10, -2.45e10, 1.23e10, -2.45e10) assert max([abs((got_vals[i] - expected_vals[i]) / expected_vals[i]) for i in range(4)]) <= 1e-4, \ ('did not get expected values for ' + encoding) test_ds = None # Test lossy J2K compression for drvname in found_j2k_drivers: tmpfilename = '/vsimem/out.grb2' gdal.ErrorReset() gdal.Translate(tmpfilename, 'data/utm.tif', format='GRIB', creationOptions=['JPEG2000_DRIVER=' + drvname, 'COMPRESSION_RATIO=20']) error_msg = gdal.GetLastErrorMsg() assert error_msg == '', \ ('did not expect error for %s, %s' % (str(filename), str(options))) out_ds = gdal.Open(tmpfilename) cs = out_ds.GetRasterBand(1).Checksum() out_ds = None gdal.Unlink(tmpfilename) if cs == 0 or cs == 50235: # 50235: lossless checksum gdaltest.post_reason('did not get expected checksum for lossy JPEG2000 with ' + drvname) print(cs) ############################################################################### # Test GRIB2 write support with warnings/errors def test_grib_grib2_write_data_encodings_warnings_and_errors(): # Cases where warnings are expected tests = [] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'DECIMAL_SCALE_FACTOR=1'], 4672]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'JPEG2000_DRIVER=FOO'], 4672]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'JPEG2000_DRIVER=FOO'], 4672]] tests += [['data/byte.tif', ['DATA_ENCODING=SIMPLE_PACKING', 'SPATIAL_DIFFERENCING_ORDER=1'], 4672]] tests += [['data/grib/ds.mint.bin', ['DATA_ENCODING=SIMPLE_PACKING'], 41640]] # should warn since simple packing doesn't support nodata tests += [['data/byte.tif', ['NBITS=32'], 4672]] tests += [['data/byte.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT', 'NBITS=8'], 4672]] tests += [['data/byte.tif', ['DATA_ENCODING=IEEE_FLOATING_POINT', 'DECIMAL_SCALE_FACTOR=-1'], 4672]] for (filename, options, expected_cs) in tests: tmpfilename = '/vsimem/out.grb2' src_ds = gdal.Open(filename) gdal.ErrorReset() with gdaltest.error_handler(): out_ds = gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) error_msg = gdal.GetLastErrorMsg() assert error_msg != '', \ ('expected warning for %s, %s' % (str(filename), str(options))) assert out_ds is not None, \ ('did not expect null return for %s, %s' % (str(filename), str(options))) cs = out_ds.GetRasterBand(1).Checksum() out_ds = None gdal.Unlink(tmpfilename) if not isinstance(expected_cs, tuple): expected_cs = (expected_cs,) assert cs in expected_cs, \ ('did not get expected checksum for %s, %s' % (str(filename), str(options))) # Cases where errors are expected tests = [] tests += [['data/byte.tif', ['DATA_ENCODING=FOO']]] # invalid DATA_ENCODING tests += [['data/byte.tif', ['JPEG2000_DRIVER=FOO', 'SPATIAL_DIFFERENCING_ORDER=BAR']]] # both cannot be used together tests += [['data/byte.tif', ['SPATIAL_DIFFERENCING_ORDER=3']]] tests += [['data/byte.tif', ['JPEG2000_DRIVER=THIS_IS_NOT_A_J2K_DRIVER']]] # non-existing driver tests += [['data/byte.tif', ['JPEG2000_DRIVER=DERIVED']]] # Read-only driver tests += [['../gcore/data/cfloat32.tif', []]] # complex data type tests += [['data/aaigrid/float64.asc', []]] # no projection tests += [['data/test_nosrs.vrt', []]] # no geotransform tests += [['data/envi/rotation.img', []]] # geotransform with rotation terms gdal.GetDriverByName('GTiff').Create('/vsimem/huge.tif', 65535, 65535, 1, options=['SPARSE_OK=YES']) tests += [['/vsimem/huge.tif', []]] # too many pixels for (filename, options,) in tests: tmpfilename = '/vsimem/out.grb2' src_ds = gdal.Open(filename) gdal.ErrorReset() with gdaltest.error_handler(): out_ds = gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) error_msg = gdal.GetLastErrorMsg() assert error_msg != '', \ ('expected warning for %s, %s' % (str(filename), str(options))) assert out_ds is None, \ ('expected null return for %s, %s' % (str(filename), str(options))) out_ds = None gdal.Unlink(tmpfilename) gdal.Unlink('/vsimem/huge.tif') with gdaltest.error_handler(): out_ds = gdal.Translate('/i/do_not/exist.grb2', 'data/byte.tif', format='GRIB') assert out_ds is None, 'expected null return' ############################################################################### # Test writing temperatures with automatic Celsius -> Kelvin conversion def test_grib_grib2_write_temperatures(): for (src_type, data_encoding, input_unit) in [ (gdal.GDT_Float32, 'IEEE_FLOATING_POINT', None), (gdal.GDT_Float32, 'IEEE_FLOATING_POINT', 'C'), (gdal.GDT_Float32, 'IEEE_FLOATING_POINT', 'K'), (gdal.GDT_Float64, 'IEEE_FLOATING_POINT', None), (gdal.GDT_Float32, 'SIMPLE_PACKING', None)]: src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, src_type) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') src_ds.SetProjection(sr.ExportToWkt()) src_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * 'f', 25.0, 25.1, 25.1, 25.2), buf_type=gdal.GDT_Float32) tmpfilename = '/vsimem/out.grb2' options = [ 'DATA_ENCODING=' + data_encoding, 'PDS_PDTN=8', 'PDS_TEMPLATE_NUMBERS=0 5 2 0 0 0 255 255 1 0 0 0 43 1 0 0 0 0 0 255 129 255 255 255 255 7 216 2 23 12 0 0 1 0 0 0 0 3 255 1 0 0 0 12 1 0 0 0 0' ] if input_unit is not None: options += ['INPUT_UNIT=' + input_unit] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) out_ds = gdal.Open(tmpfilename) got_vals = struct.unpack(4 * 'd', out_ds.ReadRaster()) out_ds = None gdal.Unlink(tmpfilename) if input_unit != 'K': expected_vals = (25.0, 25.1, 25.1, 25.2) else: expected_vals = (25.0 - 273.15, 25.1 - 273.15, 25.1 - 273.15, 25.2 - 273.15) assert max([abs((got_vals[i] - expected_vals[i]) / expected_vals[i]) for i in range(4)]) <= 1e-4, \ ('fail with data_encoding = %s and type = %s' % (data_encoding, str(src_type))) ############################################################################### @pytest.mark.parametrize('datatype', [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName) def test_grib_grib2_write_nodata(datatype): src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, datatype) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).SetNoDataValue(123) tmpfilename = '/vsimem/out.grb2' options = [ 'DATA_ENCODING=COMPLEX_PACKING' ] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).GetNoDataValue() == 123 got_vals = struct.unpack(4 * 'd', ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) for i in range(4): assert got_vals[i] == 0.0 ############################################################################### @pytest.mark.parametrize('datatype', [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName) def test_grib_grib2_write_nodata_only(datatype): src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, datatype) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).SetNoDataValue(12.3) src_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * 'f', 12.3, 12.3, 12.3, 12.3), buf_type=gdal.GDT_Float32) tmpfilename = '/vsimem/out.grb2' options = [ 'DATA_ENCODING=COMPLEX_PACKING' ] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) ds = gdal.Open(tmpfilename) if datatype == gdal.GDT_Byte: assert ds.GetRasterBand(1).GetNoDataValue() == 12 else: assert ds.GetRasterBand(1).GetNoDataValue() == pytest.approx(12.3, rel=1e-4) got_vals = struct.unpack(4 * 'd', ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) if datatype == gdal.GDT_Byte: expected_vals = (12, 12, 12, 12) else: expected_vals = (12.3, 12.3, 12.3, 12.3) assert got_vals == pytest.approx(expected_vals, rel=1e-4) ############################################################################### @pytest.mark.parametrize('datatype', [gdal.GDT_Byte, gdal.GDT_Float32], ids=gdal.GetDataTypeName) def test_grib_grib2_write_full_OneData(datatype): src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, datatype) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -1]) sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).SetNoDataValue(123) src_ds.WriteRaster(0, 0, 2, 2, struct.pack(4 * 'f', 25.4, 25.4, 25.4, 25.4), buf_type=gdal.GDT_Float32) tmpfilename = '/vsimem/out.grb2' options = [ 'DATA_ENCODING=COMPLEX_PACKING' ] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).GetNoDataValue() == 123 got_vals = struct.unpack(4 * 'd', ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) if (datatype == gdal.GDT_Byte): expected_vals = (25, 25, 25, 25) else: expected_vals = (25.4, 25.4, 25.4, 25.4) assert got_vals == pytest.approx(expected_vals, rel=1e-4) ############################################################################### def test_grib_grib2_write_mix_nodata_and_a_single_data(): src_ds = gdal.Open('data/grib/one_value_and_nodata_points.grb2') tmpfilename = '/vsimem/out.grb2' options = [ 'DATA_ENCODING=COMPLEX_PACKING', ] gdaltest.grib_drv.CreateCopy(tmpfilename, src_ds, options=options) src_ds = None ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).GetNoDataValue() == 9999 got_vals = struct.unpack(400 * 'd', ds.ReadRaster()) ds = None gdal.Unlink(tmpfilename) assert got_vals[0] == 9999 assert got_vals[6] == pytest.approx(0.01, rel=1e-4) ############################################################################### # Test GRIB2 file with JPEG2000 codestream on a single line (#6719) def test_grib_online_grib2_jpeg2000_single_line(): if not has_jp2kdrv(): pytest.skip() filename = 'CMC_hrdps_continental_PRATE_SFC_0_ps2.5km_2017111712_P001-00.grib2' if not gdaltest.download_file('http://download.osgeo.org/gdal/data/grib/' + filename): pytest.skip() ds = gdal.Open('tmp/cache/' + filename) cs = ds.GetRasterBand(1).Checksum() assert cs != 0, 'Could not open file' nd = ds.GetRasterBand(1).GetNoDataValue() assert nd == 9999, 'Bad nodata value' md = ds.GetRasterBand(1).GetMetadata() expected_md = {'GRIB_REF_TIME': ' 1510920000 sec UTC', 'GRIB_VALID_TIME': ' 1510923600 sec UTC', 'GRIB_FORECAST_SECONDS': '3600 sec', 'GRIB_UNIT': '[kg/(m^2 s)]', 'GRIB_PDS_TEMPLATE_NUMBERS': '1 7 2 50 50 0 0 0 0 0 0 0 60 1 0 0 0 0 0 255 255 255 255 255 255', 'GRIB_PDS_PDTN': '0', 'GRIB_COMMENT': 'Precipitation rate [kg/(m^2 s)]', 'GRIB_SHORT_NAME': '0-SFC', 'GRIB_ELEMENT': 'PRATE'} for k in expected_md: assert k in md and md[k] == expected_md[k], 'Did not get expected metadata' ############################################################################### # Template 4.12 with Derived forecast = spread. Do not do unit conversion ! def test_grib_grib2_derived_forecast_spread(): ds = gdal.Open('data/grib/template_4_12_spread.grb2') band = ds.GetRasterBand(1) assert band.GetMetadataItem('GRIB_UNIT') == '[spread]' assert band.ComputeRasterMinMax() == (0.24296024441719055, 0.24296024441719055) out_ds = gdaltest.grib_drv.CreateCopy('/vsimem/out.grb2', ds) band = out_ds.GetRasterBand(1) assert band.GetMetadataItem('GRIB_UNIT') == '[spread]' assert band.ComputeRasterMinMax() == (0.24296024441719055, 0.24296024441719055) out_ds = None gdal.Unlink('/vsimem/out.grb2') ############################################################################### # Template 4.48 with Optical Properties of Aerosol def test_grib_grib2_template_4_48(): ds = gdal.Open('data/grib/template_4_48.grb2') band = ds.GetRasterBand(1) assert band.GetMetadataItem('GRIB_UNIT') == '[1/kg]' assert band.GetMetadataItem('GRIB_ELEMENT') == 'ASNCON' assert band.GetMetadataItem('GRIB_SHORT_NAME') == '0-EATM' ############################################################################### # Test reading product whose scan flag is not 64 def test_grib_grib2_scan_flag_not_64(): ds = gdal.Open('/vsisparse/data/grib/blend.t17z.master.f001.co.grib2.sparse.xml') gt = ds.GetGeoTransform() expected_gt = (-3272421.457337171, 2539.703, 0.0, 3790842.1060354356, 0.0, -2539.703) assert gt == pytest.approx(expected_gt, rel=1e-6) ############################################################################### # Test reading message with subgrids def test_grib_grib2_read_subgrids(): # data/grib/subgrids.grib2 generated with: # gdal_translate ../autotest/gcore/data/byte.tif band1.tif # gdal_translate ../autotest/gcore/data/byte.tif band2.tif -scale 0 255 255 0 # gdalbuildvrt -separate tmp.vrt band1.tif band2.tif # gdal_translate tmp.vrt ../autotest/gdrivers/data/grib/subgrids.grib2 -co "BAND_1_PDS_TEMPLATE_ASSEMBLED_VALUES=2 2 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "BAND_2_PDS_TEMPLATE_ASSEMBLED_VALUES=2 3 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "IDS=CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-09-26T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)" -co WRITE_SUBGRIDS=YES ds = gdal.Open('data/grib/subgrids.grib2') assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(2).Checksum() == 4563 expected_ids = "CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=0 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-09-26T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)" assert ds.GetRasterBand(1).GetMetadataItem('GRIB_IDS') == expected_ids assert ds.GetRasterBand(2).GetMetadataItem('GRIB_IDS') == expected_ids assert ds.GetRasterBand(1).GetMetadataItem('GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES') == '2 2 2 0 84 0 0 1 0 220 0 0 255 0 0' assert ds.GetRasterBand(2).GetMetadataItem('GRIB_PDS_TEMPLATE_ASSEMBLED_VALUES') == '2 3 2 0 84 0 0 1 0 220 0 0 255 0 0' ############################################################################### # Test reading message with subgrids with second subgrid reusing the bitmap from the first one # Fixes https://github.com/OSGeo/gdal/issues/3099 def test_grib_grib2_read_subgrids_reuse_bitmap(): # File generated with gdal_translate ../autotest/gdrivers/data/grib/subgrids.grib2 ../autotest/gdrivers/data/grib/subgrids_reuse_bitmap.grib2 --config GRIB_WRITE_BITMAP_TEST YES -co "BAND_1_PDS_TEMPLATE_ASSEMBLED_VALUES=2 2 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "BAND_2_PDS_TEMPLATE_ASSEMBLED_VALUES=2 3 2 0 84 0 0 1 0 220 0 0 255 0 0" -co "IDS=CENTER=7(US-NCEP) SUBCENTER=0 MASTER_TABLE=2 LOCAL_TABLE=1 SIGNF_REF_TIME=1(Start_of_Forecast) REF_TIME=2020-09-26T00:00:00Z PROD_STATUS=0(Operational) TYPE=1(Forecast)" -co WRITE_SUBGRIDS=YES -co "DATA_ENCODING=SIMPLE_PACKING" ds = gdal.Open('data/grib/subgrids_reuse_bitmap.grib2') assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(2).Checksum() == 4563 gdalautotest-3.2.2/gdrivers/ngw.py0000775000175000017500000002376514020414366015706 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ngw.py af7dcda999a2f357cb2f86f827f8e3eee442847f 2020-05-10 20:39:19 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test NGW support. # Author: Dmitry Baryshnikov # ############################################################################### # Copyright (c) 2018-2020, NextGIS # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import sys import shutil from osgeo import gdal sys.path.append('../pymod') import gdaltest import time import json import pytest import random from datetime import datetime def check_availability(url): # Sandbox cleans at 1:05 on monday (UTC) now = datetime.utcnow() if now.weekday() == 0: if now.hour >= 1 and now.hour < 3: return False version_url = url + '/api/component/pyramid/pkg_version' if gdaltest.gdalurlopen(version_url) is None: return False # Check quota quota_url = url + '/api/resource/quota' quota_conn = gdaltest.gdalurlopen(quota_url) try: quota_json = json.loads(quota_conn.read()) quota_conn.close() if quota_json is None: return False limit = quota_json['limit'] count = quota_json['count'] if limit is None or count is None: return True return limit - count > 10 except: return False def get_new_name(): return 'gdaltest_group_' + str(int(time.time())) + '_' + str(random.randint(10, 99)) ############################################################################### # Verify we have the driver. def test_ngw_1(): gdaltest.ngw_drv = gdal.GetDriverByName('NGW') if gdaltest.ngw_drv is None: pytest.skip() # Check support CreateCopy if gdaltest.ngw_drv.GetMetadataItem(gdal.DCAP_CREATECOPY) is None: gdaltest.ngw_drv = None pytest.skip() gdaltest.ngw_test_server = 'https://sandbox.nextgis.com' if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() ############################################################################### # Check create datasource. def test_ngw_2(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() create_url = 'NGW:' + gdaltest.ngw_test_server + '/resource/0/' + get_new_name() gdal.PushErrorHandler() description = 'GDAL Raster test group' gdaltest.ngw_ds = gdaltest.ngw_drv.Create(create_url, 0, 0, 0, gdal.GDT_Unknown, \ options=['DESCRIPTION=' + description,]) gdal.PopErrorHandler() assert gdaltest.ngw_ds is not None, 'Create datasource failed.' assert gdaltest.ngw_ds.GetMetadataItem('description', '') == description, \ 'Did not get expected datasource description.' assert int(gdaltest.ngw_ds.GetMetadataItem('id', '')) > 0, \ 'Did not get expected datasource identifier.' ############################################################################### # Check rename datasource. def test_ngw_3(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() new_name = get_new_name() + '_2' ds_resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') rename_url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + ds_resource_id assert gdaltest.ngw_drv.Rename(new_name, rename_url) == gdal.CE_None, \ 'Rename datasource failed.' ############################################################################### # Create the NGW raster layer def test_ngw_4(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() src_ds = gdal.Open('data/rgbsmall.tif') resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + resource_id + '/rgbsmall' ds = gdaltest.ngw_drv.CreateCopy(url, src_ds, options=['DESCRIPTION=Test raster create']) src_ds = None assert ds is not None, 'Raster create failed' ds_resource_id = ds.GetMetadataItem('id', '') gdaltest.raster_id = ds_resource_id gdaltest.group_id = resource_id ds = None # Upload 16bit raster src_ds = gdal.Open('data/int16.tif') url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + resource_id + '/int16' ds = gdaltest.ngw_drv.CreateCopy(url, src_ds, options=[ 'DESCRIPTION=Test 16bit raster create', 'RASTER_QML_PATH=data/ngw/96.qml' ]) src_ds = None assert ds is not None, 'Raster create failed' ds = None ############################################################################### # Open the NGW dataset def test_ngw_5(): if gdaltest.ngw_drv is None or gdaltest.raster_id is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + gdaltest.raster_id gdaltest.ngw_ds = gdal.OpenEx(url, gdal.OF_RASTER) assert gdaltest.ngw_ds is not None, 'Open {} failed.'.format(url) ############################################################################### # Check various things about the configuration. def test_ngw_6(): if gdaltest.ngw_drv is None or gdaltest.ngw_ds is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() assert gdaltest.ngw_ds.RasterXSize == 1073741824 and \ gdaltest.ngw_ds.RasterYSize == 1073741824 and \ gdaltest.ngw_ds.RasterCount == 4, 'Wrong size or band count.' wkt = gdaltest.ngw_ds.GetProjectionRef() assert wkt[:33] == 'PROJCS["WGS 84 / Pseudo-Mercator"', 'Got wrong SRS: ' + wkt gt = gdaltest.ngw_ds.GetGeoTransform() # -20037508.34, 0.037322767712175846, 0.0, 20037508.34, 0.0, -0.037322767712175846 assert gt[0] == pytest.approx(-20037508.34, abs=0.00001) \ or gt[3] == pytest.approx(20037508.34, abs=0.00001) \ or gt[1] == pytest.approx(0.037322767712175846, abs=0.00001) \ or gt[2] == pytest.approx(0.0, abs=0.00001) \ or gt[5] == pytest.approx(-0.037322767712175846, abs=0.00001) \ or gt[4] == pytest.approx(0.0, abs=0.00001), 'Wrong geotransform. {}'.format(gt) assert gdaltest.ngw_ds.GetRasterBand(1).GetOverviewCount() > 0, 'No overviews!' assert gdaltest.ngw_ds.GetRasterBand(1).DataType == gdal.GDT_Byte, \ 'Wrong band data type.' ############################################################################### # Check checksum execute success for a small region. def test_ngw_7(): if gdaltest.ngw_drv is None or gdaltest.ngw_ds is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_ds = None gdaltest.ngw_drv = None pytest.skip() gdal.ErrorReset() gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'ON') gdal.PushErrorHandler('CPLQuietErrorHandler') ovr_band = gdaltest.ngw_ds.GetRasterBand(1).GetOverview(21) assert ovr_band is not None ovr_band.Checksum() gdal.PopErrorHandler() gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'OFF') msg = gdal.GetLastErrorMsg() assert gdal.GetLastErrorType() != gdal.CE_Failure, msg gdal.ErrorReset() ############################################################################### # Test getting subdatasets from GetCapabilities def test_ngw_8(): if gdaltest.ngw_drv is None or gdaltest.group_id is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + gdaltest.group_id ds = gdal.OpenEx(url, gdal.OF_VECTOR | gdal.OF_RASTER ) assert ds is not None, 'Open of {} failed.'.format(url) subdatasets = ds.GetMetadata("SUBDATASETS") assert subdatasets, 'Did not get expected subdataset count. Get {} subdatasets. Url: {}'.format(len(subdatasets), url) name = subdatasets['SUBDATASET_0_NAME'] ds = gdal.OpenEx(name, gdal.OF_RASTER) assert ds is not None, 'Open of {} failed.'.format(name) ds = None ############################################################################### def test_ngw_cleanup(): if gdaltest.ngw_drv is None: pytest.skip() if gdaltest.group_id is not None: delete_url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + gdaltest.group_id gdaltest.ngw_ds = None assert gdaltest.ngw_drv.Delete(delete_url) == gdal.CE_None, \ 'Failed to delete datasource ' + delete_url + '.' gdaltest.ngw_ds = None gdaltest.clean_tmp() try: shutil.rmtree('gdalwmscache') except OSError: pass gdalautotest-3.2.2/gdrivers/plmosaic.py0000775000175000017500000006770214020414366016721 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: plmosaic.py 2da6e90962a140a55650fd7ccf263cbf84c52b9c 2019-08-07 14:31:52 +1200 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: PlanetLabs mosaic driver test suite. # Author: Even Rouault, even dot rouault at spatialys.com # ############################################################################### # Copyright (c) 2015, Planet Labs # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil import struct from osgeo import gdal import gdaltest import pytest ############################################################################### # Find PLMosaic driver def test_plmosaic_1(): gdaltest.plmosaic_drv = gdal.GetDriverByName('PLMosaic') if gdaltest.plmosaic_drv is not None: return pytest.skip() ############################################################################### # Error: no API_KEY def test_plmosaic_2(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert ds is None ############################################################################### # Error case: invalid root URL def test_plmosaic_3(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/does_not_exist/') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert ds is None ############################################################################### # Error case: invalid JSON def test_plmosaic_4(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root', """{""") gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert ds is None ############################################################################### # Error case: not a JSON dictionary def test_plmosaic_5(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root', """null""") gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert ds is None ############################################################################### # Error case: missing "mosaics" element def test_plmosaic_6(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root', """{}""") gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert ds is None ############################################################################### # Valid root but no mosaics def test_plmosaic_7(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root', """{ "mosaics": [], }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds is None ds = None ############################################################################### # Valid root with 2 mosaics def test_plmosaic_8(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root', """{ "_links" : { "_next": "/vsimem/root/?page=2" }, "mosaics": [ { "id": "my_mosaic_id", "name": "my_mosaic_name", "coordinate_system": "EPSG:3857", "_links" : { "_self": "/vsimem/root/my_mosaic" }, "quad_download": true } ], }""") gdal.FileFromMemBuffer('/vsimem/root/?page=2', """{ "_links" : { "_next": null }, "mosaics": [ { "id": "another_mosaic_id", "name": "another_mosaic_name", "coordinate_system": "EPSG:3857", "_links" : { "_self": "/vsimem/root/another_mosaic" }, "quad_download": true }, { "id": "this_one_will_be_ignored", "name": "this_one_will_be_ignored", "coordinate_system": "EPSG:1234", "_links" : { "_self": "/vsimem/root/this_one_will_be_ignored" }, "quad_download": true } ], }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds.GetMetadata("SUBDATASETS") == {'SUBDATASET_2_NAME': 'PLMOSAIC:mosaic=another_mosaic_name', 'SUBDATASET_2_DESC': 'Mosaic another_mosaic_name', 'SUBDATASET_1_NAME': 'PLMOSAIC:mosaic=my_mosaic_name', 'SUBDATASET_1_DESC': 'Mosaic my_mosaic_name'} ds = None ############################################################################### # Error case: invalid mosaic def test_plmosaic_9(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=does_not_exist']) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert ds is None and gdal.GetLastErrorMsg().find('/vsimem/root/?name__is=does_not_exist') >= 0 ############################################################################### # Invalid mosaic definition: invalid JSON def test_plmosaic_9bis(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('JSON parsing error') >= 0 ############################################################################### # Invalid mosaic definition: JSON without mosaics array def test_plmosaic_9ter(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{}""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('No mosaic my_mosaic') >= 0 ############################################################################### # Invalid mosaic definition: missing parameters def test_plmosaic_10(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic" }] }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('Missing required parameter') >= 0 ############################################################################### # Invalid mosaic definition: unsupported projection def test_plmosaic_11(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:1234", "datatype": "byte", "grid": { "quad_size": 4096, "resolution": 4.77731426716 } }] }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('Unsupported coordinate_system') >= 0 ############################################################################### # Invalid mosaic definition: unsupported datatype def test_plmosaic_12(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "datatype": "blabla", "grid": { "quad_size": 4096, "resolution": 4.77731426716 } }] }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('Unsupported data_type') >= 0 ############################################################################### # Invalid mosaic definition: unsupported resolution def test_plmosaic_13(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "datatype": "byte", "grid": { "quad_size": 4096, "resolution": 1.1234 } }] }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('Unsupported resolution') >= 0 ############################################################################### # Invalid mosaic definition: unsupported quad_size def test_plmosaic_14(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "datatype": "byte", "grid": { "quad_size": 1234, "resolution": 4.77731426716 } }] }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('Unsupported quad_size') >= 0 ############################################################################### # Nearly valid mosaic definition. Warning about invalid links.tiles def test_plmosaic_15(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "datatype": "byte", "grid": { "quad_size": 4096, "resolution": 4.77731426716 }, "first_acquired": "first_date", "last_acquired": "last_date", "_links" : { "tiles" : "/vsimem/root/my_mosaic/tiles/foo" }, "quad_download": true }] }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert gdal.GetLastErrorMsg().find('Invalid _links.tiles') >= 0 assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None ds = None ############################################################################### # Valid mosaic definition def test_plmosaic_16(): if gdaltest.plmosaic_drv is None: pytest.skip() try: shutil.rmtree('tmp/plmosaic_cache') except OSError: pass gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "datatype": "byte", "grid": { "quad_size": 4096, "resolution": 4.77731426716 }, "first_acquired": "first_date", "last_acquired": "last_date", "_links" : { "tiles" : "/vsimem/root/my_mosaic/tiles{0-3}/{z}/{x}/{y}.png" }, "quad_download": true }] }""") # Valid root: one single mosaic, should open the dataset directly gdal.FileFromMemBuffer('/vsimem/root', """{ "mosaics": [ { "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "_links" : { "_self": "/vsimem/root/my_mosaic" }, "quad_download": true } ], }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') gdal.PushErrorHandler() ds = gdal.OpenEx('PLMosaic:api_key=foo,unsupported_option=val', gdal.OF_RASTER) gdal.PopErrorHandler() gdal.SetConfigOption('PL_URL', None) assert ds is None and gdal.GetLastErrorMsg().find('Unsupported option unsupported_option') >= 0 gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds.GetMetadata("SUBDATASETS") == {} assert ds.GetMetadata() == {'LAST_ACQUIRED': 'last_date', 'NAME': 'my_mosaic', 'FIRST_ACQUIRED': 'first_date'} ds = None ############################################################################### # Open with explicit MOSAIC dataset open option def test_plmosaic_17(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) gdal.SetConfigOption('PL_URL', None) assert ds is not None assert ds.GetMetadata() == {'LAST_ACQUIRED': 'last_date', 'NAME': 'my_mosaic', 'FIRST_ACQUIRED': 'first_date'} assert ds.GetProjectionRef().find('3857') >= 0 assert ds.RasterXSize == 8388608 assert ds.RasterYSize == 8388608 got_gt = ds.GetGeoTransform() expected_gt = (-20037508.34, 4.7773142671600004, 0.0, 20037508.34, 0.0, -4.7773142671600004) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8), ds.GetGeoTransform() assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'PIXEL', \ ds.GetMetadata('IMAGE_STRUCTURE') assert ds.GetRasterBand(1).GetOverviewCount() == 15 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(ds.GetRasterBand(1).GetOverviewCount()) is None assert ds.GetRasterBand(1).GetOverview(0) is not None try: shutil.rmtree('tmp/plmosaic_cache') except OSError: pass for i in range(12): # Read at one nonexistent position. ds.GetRasterBand(1).ReadRaster(4096 * i, 0, 1, 1) assert gdal.GetLastErrorMsg() == '' for i in range(11, -1, -1): # Again in the same quad, but in different block, to test cache ds.GetRasterBand(1).ReadRaster(4096 * i + 256, 0, 1, 1) assert gdal.GetLastErrorMsg() == '' for i in range(12): # Again in the same quad, but in different block, to test cache ds.GetRasterBand(1).ReadRaster(4096 * i + 512, 256, 1, 1) assert gdal.GetLastErrorMsg() == '' ds.FlushCache() # Invalid tile content gdal.FileFromMemBuffer('/vsimem/root/my_mosaic_id/quads/0-2047/full', 'garbage') gdal.PushErrorHandler() ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) gdal.PopErrorHandler() os.stat('tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif') ds.FlushCache() shutil.rmtree('tmp/plmosaic_cache') # GeoTIFF but with wrong dimensions gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 1, 1, 1) gdal.PushErrorHandler() ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) gdal.PopErrorHandler() os.stat('tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif') ds.FlushCache() shutil.rmtree('tmp/plmosaic_cache') # Good GeoTIFF tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) tmp_ds.GetRasterBand(1).Fill(255) tmp_ds = None val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) val = struct.unpack('B', val)[0] assert val == 255 os.stat('tmp/plmosaic_cache/my_mosaic/my_mosaic_0-2047.tif') ds.FlushCache() # Read again from file cache. # We change the file behind the scene (but not changing its size) # to demonstrate that the cached tile is still use tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) tmp_ds.GetRasterBand(1).Fill(1) tmp_ds = None val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) val = struct.unpack('B', val)[0] assert val == 255 ds = None # Read again from file cache, but with TRUST_CACHE=YES # delete the full GeoTIFF before gdal.Unlink('/vsimem/root/my_mosaic_id/quads/0-2047/full') gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:API_KEY=foo,MOSAIC=my_mosaic,CACHE_PATH=tmp,TRUST_CACHE=YES', gdal.OF_RASTER) gdal.SetConfigOption('PL_URL', None) val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) val = struct.unpack('B', val)[0] assert val == 255 ds = None # Read again from file cache but the metatile has changed in between gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) gdal.SetConfigOption('PL_URL', None) tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/0-2047/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) tmp_ds.SetMetadataItem('foo', 'bar') tmp_ds.GetRasterBand(1).Fill(254) tmp_ds = None val = ds.ReadRaster(0, 0, 1, 1) val = struct.unpack('B' * 4, val) assert val == (254, 0, 0, 0) ############################################################################### # Test location info def test_plmosaic_18(): if gdaltest.plmosaic_drv is None: pytest.skip() shutil.rmtree('tmp/plmosaic_cache') gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=tmp']) gdal.SetConfigOption('PL_URL', None) ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') assert ret == """ """ old_ret = ret ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') assert ret == old_ret gdal.FileFromMemBuffer('/vsimem/root/my_mosaic_id/quads/0-2047/items', """{ "items": [ { "link": "foo" } ] }""") ds.FlushCache() ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') assert ret == """ foo """ ds = None ############################################################################### # Try error in saving in cache def test_plmosaic_19(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=/does_not_exist']) gdal.SetConfigOption('PL_URL', None) gdal.PushErrorHandler() val = ds.ReadRaster(0, 0, 1, 1) gdal.PopErrorHandler() val = struct.unpack('B' * 4, val) assert val == (254, 0, 0, 0) val = ds.ReadRaster(256, 0, 1, 1) val = struct.unpack('B' * 4, val) assert val == (254, 0, 0, 0) ds = None ############################################################################### # Try disabling cache def test_plmosaic_20(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=']) gdal.SetConfigOption('PL_URL', None) val = ds.ReadRaster(0, 0, 1, 1) val = struct.unpack('B' * 4, val) assert val == (254, 0, 0, 0) val = ds.ReadRaster(256, 0, 1, 1) val = struct.unpack('B' * 4, val) assert val == (254, 0, 0, 0) ds = None ############################################################################### # Try use_tiles def test_plmosaic_21(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=my_mosaic', 'CACHE_PATH=', 'USE_TILES=YES']) gdal.SetConfigOption('PL_URL', None) gdal.ErrorReset() gdal.PushErrorHandler() ds.ReadRaster(256, 512, 1, 1) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() gdal.PushErrorHandler() ds.GetRasterBand(1).ReadRaster(256, 512, 1, 1) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() gdal.PushErrorHandler() ds.GetRasterBand(1).ReadBlock(1, 2) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.FileFromMemBuffer('/vsimem/root/?name__is=mosaic_uint16', """{ "mosaics": [{ "id": "mosaic_uint16", "name": "mosaic_uint16", "coordinate_system": "EPSG:3857", "datatype": "uint16", "grid": { "quad_size": 4096, "resolution": 4.77731426716 }, "first_acquired": "first_date", "last_acquired": "last_date", "_links" : { "tiles" : "/vsimem/root/mosaic_uint16/tiles{0-3}/{z}/{x}/{y}.png" }, "quad_download": true }] }""") # Should emit a warning gdal.ErrorReset() gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=mosaic_uint16', 'CACHE_PATH=', 'USE_TILES=YES']) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('Cannot use tile API for full resolution data on non Byte mosaic') >= 0 gdal.FileFromMemBuffer('/vsimem/root/?name__is=mosaic_without_tiles', """{ "mosaics": [{ "id": "mosaic_without_tiles", "name": "mosaic_without_tiles", "coordinate_system": "EPSG:3857", "datatype": "byte", "grid": { "quad_size": 4096, "resolution": 4.77731426716 }, "first_acquired": "first_date", "last_acquired": "last_date", "quad_download": true }] }""") # Should emit a warning gdal.ErrorReset() gdal.PushErrorHandler() gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo', 'MOSAIC=mosaic_without_tiles', 'CACHE_PATH=', 'USE_TILES=YES']) gdal.SetConfigOption('PL_URL', None) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('Cannot find tile definition, so use_tiles will be ignored') >= 0 ############################################################################### # Valid mosaic definition with bbox def test_plmosaic_with_bbox(): if gdaltest.plmosaic_drv is None: pytest.skip() try: shutil.rmtree('tmp/plmosaic_cache') except OSError: pass gdal.FileFromMemBuffer('/vsimem/root/?name__is=my_mosaic', """{ "mosaics": [{ "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "datatype": "byte", "grid": { "quad_size": 4096, "resolution": 4.77731426716 }, "bbox" : [ -100, 30, -90, 40 ], "first_acquired": "first_date", "last_acquired": "last_date", "_links" : { "tiles" : "/vsimem/root/my_mosaic/tiles{0-3}/{z}/{x}/{y}.png" }, "quad_download": true }] }""") # Valid root: one single mosaic, should open the dataset directly gdal.FileFromMemBuffer('/vsimem/root', """{ "mosaics": [ { "id": "my_mosaic_id", "name": "my_mosaic", "coordinate_system": "EPSG:3857", "_links" : { "_self": "/vsimem/root/my_mosaic" }, "quad_download": true } ], }""") gdal.SetConfigOption('PL_URL', '/vsimem/root') ds = gdal.OpenEx('PLMosaic:', gdal.OF_RASTER, open_options=['API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds.RasterXSize == 233472 assert ds.RasterYSize == 286720 got_gt = ds.GetGeoTransform() expected_gt = (-11134123.286585508, 4.77731426716, 0.0, 4872401.930333553, 0.0, -4.77731426716) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-8) # Good GeoTIFF tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/root/my_mosaic_id/quads/455-1272/full', 4096, 4096, 4, options=['INTERLEAVE=BAND', 'SPARSE_OK=YES']) tmp_ds.GetRasterBand(1).Fill(125) tmp_ds = None val = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) val = struct.unpack('B', val)[0] assert val == 125 gdal.FileFromMemBuffer('/vsimem/root/my_mosaic_id/quads/455-1272/items', """{ "items": [ { "link": "bar" } ] }""") ret = ds.GetRasterBand(1).GetMetadataItem('Pixel_0_0', 'LocationInfo') assert ret == """ bar """ ############################################################################### # def test_plmosaic_cleanup(): if gdaltest.plmosaic_drv is None: pytest.skip() gdal.Unlink('/vsimem/root_no_mosaics') gdal.Unlink('/vsimem/root') gdal.Unlink('/vsimem/root/?page=2') gdal.Unlink('/vsimem/root/?name__is=my_mosaic') gdal.Unlink('/vsimem/root/my_mosaic_id/quads/0-2047/full') gdal.Unlink('/vsimem/root/my_mosaic_id/quads/0-2047/items') gdal.Unlink('/vsimem/root/my_mosaic_id/quads/455-1272/full') gdal.Unlink('/vsimem/root/my_mosaic_id/quads/455-1272/items') gdal.Unlink('/vsimem/root/?name__is=mosaic_uint16') gdal.Unlink('/vsimem/root/?name__is=mosaic_without_tiles') if gdal.ReadDir('/vsimem/root') is not None: print(gdal.ReadDir('/vsimem/root')) try: shutil.rmtree('tmp/plmosaic_cache') except OSError: pass gdalautotest-3.2.2/gdrivers/hfa.py0000775000175000017500000013010114020414366015630 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: hfa.py 9c1d2cb8f61668b50989b1fcfd4193bbb648f40e 2020-06-27 21:10:06 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test some functions of HFA driver. Most testing in ../gcore/hfa_* # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008-2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import struct from osgeo import gdal import gdaltest import pytest ############################################################################### # Verify we can read the special histogram metadata from a provided image. def test_hfa_histread(): ds = gdal.Open('../gcore/data/utmsmall.img') md = ds.GetRasterBand(1).GetMetadata() ds = None assert md['STATISTICS_MINIMUM'] == '8', 'STATISTICS_MINIMUM is wrong.' assert md['STATISTICS_MEDIAN'] == '148', 'STATISTICS_MEDIAN is wrong.' assert md['STATISTICS_HISTOMAX'] == '255', 'STATISTICS_HISTOMAX is wrong.' assert md['STATISTICS_HISTOBINVALUES'] == '0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|', \ 'STATISTICS_HISTOBINVALUES is wrong.' assert md['STATISTICS_SKIPFACTORX'] == '1', 'STATISTICS_SKIPFACTORX is wrong.' assert md['STATISTICS_SKIPFACTORY'] == '1', 'STATISTICS_SKIPFACTORY is wrong.' assert md['STATISTICS_EXCLUDEDVALUES'] == '0', 'STATISTICS_EXCLUDEDVALUE is wrong.' ############################################################################### # Verify that if we copy this test image to a new Imagine file the histogram # info is preserved. def test_hfa_histwrite(): drv = gdal.GetDriverByName('HFA') ds_src = gdal.Open('../gcore/data/utmsmall.img') out_ds = drv.CreateCopy('tmp/work.img', ds_src) del out_ds ds_src = None # Remove .aux.xml file as histogram can be written in it tmpAuxXml = 'tmp/work.img.aux.xml' if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) ds = gdal.Open('tmp/work.img') md = ds.GetRasterBand(1).GetMetadata() ds = None drv.Delete('tmp/work.img') assert md['STATISTICS_MINIMUM'] == '8', 'STATISTICS_MINIMUM is wrong.' assert md['STATISTICS_MEDIAN'] == '148', 'STATISTICS_MEDIAN is wrong.' assert md['STATISTICS_HISTOMAX'] == '255', 'STATISTICS_HISTOMAX is wrong.' assert md['STATISTICS_HISTOBINVALUES'] == '0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|', \ 'STATISTICS_HISTOBINVALUES is wrong.' ############################################################################### # Verify that if we copy this test image to a new Imagine file and then re-write the # histogram information, the new histogram can then be read back in. def test_hfa_histrewrite(): drv = gdal.GetDriverByName('HFA') ds_src = gdal.Open('../gcore/data/utmsmall.img') out_ds = drv.CreateCopy('tmp/work.img', ds_src) del out_ds ds_src = None # Remove .aux.xml file as histogram can be written in it tmpAuxXml = 'tmp/work.img.aux.xml' if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) # A new histogram which is different to what is in the file. It won't match the data, # but we are just testing the re-writing of the histogram, so we don't mind. newHist = '8|23|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|533|0|0|0|0|0|0|0|544|0|0|0|0|0|0|0|0|626|0|0|0|0|0|0|0|653|0|0|0|0|0|0|0|673|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|586|0|0|0|0|0|0|0|541|0|0|0|0|0|0|0|435|0|0|0|0|0|0|0|348|0|0|0|0|0|0|0|341|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|824|' ds = gdal.Open('tmp/work.img', gdal.GA_Update) band = ds.GetRasterBand(1) band.SetMetadataItem('STATISTICS_HISTOBINVALUES', newHist) ds = None if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) ds = gdal.Open('tmp/work.img') histStr = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_HISTOBINVALUES') ds = None drv.Delete('tmp/work.img') assert histStr == newHist, 'Rewritten STATISTICS_HISTOBINVALUES is wrong.' ############################################################################### # Verify we can read metadata of int.img. def test_hfa_int_stats_1(): ds = gdal.Open('data/hfa/int.img') md = ds.GetRasterBand(1).GetMetadata() ds = None assert md['STATISTICS_MINIMUM'] == '40918', 'STATISTICS_MINIMUM is wrong.' assert md['STATISTICS_MAXIMUM'] == '41134', 'STATISTICS_MAXIMUM is wrong.' assert md['STATISTICS_MEDIAN'] == '41017', 'STATISTICS_MEDIAN is wrong.' assert md['STATISTICS_MODE'] == '41013', 'STATISTICS_MODE is wrong.' assert md['STATISTICS_HISTOMIN'] == '40918', 'STATISTICS_HISTOMIN is wrong.' assert md['STATISTICS_HISTOMAX'] == '41134', 'STATISTICS_HISTOMAX is wrong.' assert md['LAYER_TYPE'] == 'athematic', 'LAYER_TYPE is wrong.' ############################################################################### # Verify we can read band statistics of int.img. def test_hfa_int_stats_2(): ds = gdal.Open('data/hfa/int.img') stats = ds.GetRasterBand(1).GetStatistics(False, True) ds = None tolerance = 0.0001 assert stats[0] == pytest.approx(40918.0, abs=tolerance), 'Minimum value is wrong.' assert stats[1] == pytest.approx(41134.0, abs=tolerance), 'Maximum value is wrong.' assert stats[2] == pytest.approx(41019.784218148, abs=tolerance), 'Mean value is wrong.' assert stats[3] == pytest.approx(44.637237445468, abs=tolerance), 'StdDev value is wrong.' ############################################################################### # Verify we can read metadata of float.img. def test_hfa_float_stats_1(): ds = gdal.Open('data/hfa/float.img') md = ds.GetRasterBand(1).GetMetadata() ds = None tolerance = 0.0001 mini = float(md['STATISTICS_MINIMUM']) assert mini == pytest.approx(40.91858291626, abs=tolerance), 'STATISTICS_MINIMUM is wrong.' maxi = float(md['STATISTICS_MAXIMUM']) assert maxi == pytest.approx(41.134323120117, abs=tolerance), 'STATISTICS_MAXIMUM is wrong.' median = float(md['STATISTICS_MEDIAN']) assert median == pytest.approx(41.017182931304, abs=tolerance), 'STATISTICS_MEDIAN is wrong.' mod = float(md['STATISTICS_MODE']) assert mod == pytest.approx(41.0104410499, abs=tolerance), 'STATISTICS_MODE is wrong.' histMin = float(md['STATISTICS_HISTOMIN']) assert histMin == pytest.approx(40.91858291626, abs=tolerance), 'STATISTICS_HISTOMIN is wrong.' histMax = float(md['STATISTICS_HISTOMAX']) assert histMax == pytest.approx(41.134323120117, abs=tolerance), 'STATISTICS_HISTOMAX is wrong.' assert md['LAYER_TYPE'] == 'athematic', 'LAYER_TYPE is wrong.' ############################################################################### # Verify we can read band statistics of float.img. def test_hfa_float_stats_2(): ds = gdal.Open('data/hfa/float.img') stats = ds.GetRasterBand(1).GetStatistics(False, True) ds = None tolerance = 0.0001 assert stats[0] == pytest.approx(40.91858291626, abs=tolerance), 'Minimum value is wrong.' assert stats[1] == pytest.approx(41.134323120117, abs=tolerance), 'Maximum value is wrong.' assert stats[2] == pytest.approx(41.020284249223, abs=tolerance), 'Mean value is wrong.' assert stats[3] == pytest.approx(0.044636441749041, abs=tolerance), 'StdDev value is wrong.' ############################################################################### # Verify we can read image data. def test_hfa_int_read(): ds = gdal.Open('data/hfa/int.img') band = ds.GetRasterBand(1) cs = band.Checksum() band.ReadRaster(100, 100, 1, 1) ds = None assert cs == 6691, 'Checksum value is wrong.' ############################################################################### # Verify we can read image data. def test_hfa_float_read(): ds = gdal.Open('data/hfa/float.img') band = ds.GetRasterBand(1) cs = band.Checksum() data = band.ReadRaster(100, 100, 1, 1) ds = None assert cs == 23529, 'Checksum value is wrong.' # Read raw data into tuple of float numbers import struct value = struct.unpack('f' * 1, data)[0] assert value == pytest.approx(41.021659851074219, abs=0.0001), 'Pixel value is wrong.' ############################################################################### # verify we can read PE_STRING coordinate system. def test_hfa_pe_read(): ds = gdal.Open('data/hfa/87test.img') wkt = ds.GetProjectionRef() expected = 'PROJCS["World_Cube",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Cube"],PARAMETER["False_Easting",0],PARAMETER["False_Northing",0],PARAMETER["Central_Meridian",0],PARAMETER["Option",1],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' assert wkt == expected, 'failed to read pe string as expected.' ############################################################################### # Verify we can write PE_STRING nodes. def test_hfa_pe_write(): drv = gdal.GetDriverByName('HFA') ds_src = gdal.Open('data/hfa/87test.img') out_ds = drv.CreateCopy('tmp/87test.img', ds_src) del out_ds ds_src = None expected = 'PROJCS["World_Cube",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Cube"],PARAMETER["False_Easting",0],PARAMETER["False_Northing",0],PARAMETER["Central_Meridian",0],PARAMETER["Option",1],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' ds = gdal.Open('tmp/87test.img') wkt = ds.GetProjectionRef() if wkt != expected: print('') pytest.fail('failed to write pe string as expected.') ds = None drv.Delete('tmp/87test.img') ############################################################################### # Verify we can write and read large metadata items. def test_hfa_metadata_1(): drv = gdal.GetDriverByName('HFA') ds = drv.Create('tmp/md_1.img', 100, 150, 1, gdal.GDT_Byte) md_val = '0123456789' * 60 md = {'test': md_val} ds.GetRasterBand(1).SetMetadata(md) ds = None ds = gdal.Open('tmp/md_1.img') md = ds.GetRasterBand(1).GetMetadata() assert md['test'] == md_val, 'got wrong metadata back' ds = None ############################################################################### # Verify that writing metadata multiple times does not result in duplicate # nodes. def test_hfa_metadata_2(): ds = gdal.Open('tmp/md_1.img', gdal.GA_Update) md = ds.GetRasterBand(1).GetMetadata() md['test'] = '0123456789' md['xxx'] = '123' ds.GetRasterBand(1).SetMetadata(md) ds = None ds = gdal.Open('tmp/md_1.img') md = ds.GetRasterBand(1).GetMetadata() assert 'xxx' in md, 'metadata rewrite seems not to have worked' assert md['xxx'] == '123' and md['test'] == '0123456789', 'got wrong metadata back' ds = None gdal.GetDriverByName('HFA').Delete('tmp/md_1.img') ############################################################################### # Verify we can grow the RRD list in cases where this requires # moving the HFAEntry to the end of the file. (bug #1109) def test_hfa_grow_rrdlist(): import shutil shutil.copyfile('data/hfa/bug_1109.img', 'tmp/bug_1109.img') # os.system("copy data\\bug_1109.img tmp") # Add two overview levels. ds = gdal.Open('tmp/bug_1109.img', gdal.GA_Update) result = ds.BuildOverviews(overviewlist=[4, 8]) ds = None assert result == 0, 'BuildOverviews failed.' # Verify overviews are now findable. ds = gdal.Open('tmp/bug_1109.img') assert ds.GetRasterBand(1).GetOverviewCount() == 3, 'Overview count wrong.' ds = None gdal.GetDriverByName('HFA').Delete('tmp/bug_1109.img') ############################################################################### # Make sure an old .ige file is deleted when creating a new dataset. (#1784) def test_hfa_clean_ige(): # Create an imagine file, forcing creation of an .ige file. drv = gdal.GetDriverByName('HFA') src_ds = gdal.Open('data/byte.tif') out_ds = drv.CreateCopy('tmp/igetest.img', src_ds, options=['USE_SPILL=YES']) out_ds = None try: open('tmp/igetest.ige') except IOError: pytest.fail('ige file not created with USE_SPILL=YES') # confirm ige shows up in file list. ds = gdal.Open('tmp/igetest.img') filelist = ds.GetFileList() ds = None found = 0 for item in filelist: if item[-11:] == 'igetest.ige': found = 1 if not found: print(filelist) pytest.fail('no igetest.ige in file list!') # Create a file without a spill file, and verify old ige cleaned up. out_ds = drv.CreateCopy('tmp/igetest.img', src_ds) del out_ds assert not os.path.exists('tmp/igetest.ige') drv.Delete('tmp/igetest.img') ############################################################################### # Verify that we can read this corrupt .aux file without hanging (#1907) def test_hfa_corrupt_aux(): # NOTE: we depend on being able to open .aux files as a weak sort of # dataset. gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/hfa/F0116231.aux') gdal.PopErrorHandler() assert ds.RasterXSize == 1104, 'did not get expected dataset characteristics' assert gdal.GetLastErrorType() == 2 and gdal.GetLastErrorMsg().find('Corrupt (looping)') != -1, \ 'Did not get expected warning.' ds = None ############################################################################### # support MapInformation for units (#1967) def test_hfa_mapinformation_units(): # NOTE: we depend on being able to open .aux files as a weak sort of # dataset. gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/hfa/fg118-91.aux') gdal.PopErrorHandler() wkt = ds.GetProjectionRef() expected_wkt = """PROJCS["NAD_1983_StatePlane_Virginia_North_FIPS_4501_Feet",GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199432955],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",11482916.66666666],PARAMETER["False_Northing",6561666.666666666],PARAMETER["Central_Meridian",-78.5],PARAMETER["Standard_Parallel_1",38.03333333333333],PARAMETER["Standard_Parallel_2",39.2],PARAMETER["Latitude_Of_Origin",37.66666666666666],UNIT["Foot_US",0.304800609601219241]]""" if gdaltest.equal_srs_from_wkt(expected_wkt, wkt): return pytest.fail() ############################################################################### # Write nodata value. def test_hfa_nodata_write(): drv = gdal.GetDriverByName('HFA') ds = drv.Create('tmp/nodata.img', 7, 7, 1, gdal.GDT_Byte) p = [1, 2, 1, 4, 1, 2, 1] raw_data = b''.join(struct.pack('h', x) for x in p) for line in range(7): ds.WriteRaster(0, line, 7, 1, raw_data, buf_type=gdal.GDT_Int16) b = ds.GetRasterBand(1) b.SetNoDataValue(1) ds = None ############################################################################### # Verify written nodata value. def test_hfa_nodata_read(): ds = gdal.Open('tmp/nodata.img') b = ds.GetRasterBand(1) assert b.GetNoDataValue() == 1, 'failed to preserve nodata value' stats = b.GetStatistics(False, True) tolerance = 0.0001 assert stats[0] == pytest.approx(2, abs=tolerance), 'Minimum value is wrong.' assert stats[1] == pytest.approx(4, abs=tolerance), 'Maximum value is wrong.' assert stats[2] == pytest.approx(2.6666666666667, abs=tolerance), 'Mean value is wrong.' assert stats[3] == pytest.approx(0.94280904158206, abs=tolerance), 'StdDev value is wrong.' b = None ds = None gdal.GetDriverByName('HFA').Delete('tmp/nodata.img') ############################################################################### # Verify we read simple affine geotransforms properly. def test_hfa_rotated_read(): ds = gdal.Open('data/hfa/fg118-91.aux') check_gt = (11856857.07898215, 0.895867662235625, 0.02684252936279331, 7041861.472946444, 0.01962103617166367, -0.9007880319529181) gt_epsilon = (abs(check_gt[1]) + abs(check_gt[2])) / 100.0 new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=gt_epsilon): print('') print('old = ', check_gt) print('new = ', new_gt) pytest.fail('Geotransform differs.') ds = None ############################################################################### # Verify we can write affine geotransforms. def test_hfa_rotated_write(): # make sure we aren't preserving info in .aux.xml file try: os.remove('tmp/rot.img.aux.xml') except OSError: pass drv = gdal.GetDriverByName('HFA') ds = drv.Create('tmp/rot.img', 100, 150, 1, gdal.GDT_Byte) check_gt = (11856857.07898215, 0.895867662235625, 0.02684252936279331, 7041861.472946444, 0.01962103617166367, -0.9007880319529181) expected_wkt = """PROJCS["NAD83 / Virginia North", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], AUTHORITY["EPSG","6269"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.01745329251994328, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4269"]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",39.2], PARAMETER["standard_parallel_2",38.03333333333333], PARAMETER["latitude_of_origin",37.66666666666666], PARAMETER["central_meridian",-78.5], PARAMETER["false_easting",11482916.66666667], PARAMETER["false_northing",6561666.666666667], UNIT["us_survey_feet",0.3048006096012192]]""" # For some reason we are now no longer able to preserve the authority # nodes and other info in the above, so we revert to the following. # (see #2755 for followup). expected_wkt = """PROJCS["NAD83_Virginia_North",GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",39.2],PARAMETER["standard_parallel_2",38.03333333333333],PARAMETER["latitude_of_origin",37.66666666666666],PARAMETER["central_meridian",-78.5],PARAMETER["false_easting",11482916.66666667],PARAMETER["false_northing",6561666.666666667],PARAMETER["scale_factor",1.0],UNIT["Foot_US",0.30480060960121924]]""" ds.SetGeoTransform(check_gt) ds.SetProjection(expected_wkt) ds = None ds = gdal.Open('tmp/rot.img') gt_epsilon = (abs(check_gt[1]) + abs(check_gt[2])) / 100.0 new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=gt_epsilon): print('') print('old = ', check_gt) print('new = ', new_gt) pytest.fail('Geotransform differs.') wkt = ds.GetProjection() assert gdaltest.equal_srs_from_wkt(expected_wkt, wkt) ds = None gdal.GetDriverByName('HFA').Delete('tmp/rot.img') ############################################################################### # Test creating an in memory copy. def test_hfa_vsimem(): tst = gdaltest.GDALTest('HFA', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test that PROJCS[] names are preserved as the mapinfo.proName in # the .img file. (#2422) def test_hfa_proName(): drv = gdal.GetDriverByName('HFA') src_ds = gdal.Open('data/hfa/stateplane.vrt') dst_ds = drv.CreateCopy('tmp/proname.img', src_ds) del dst_ds src_ds = None # Make sure we don't have interference from an .aux.xml try: os.remove('tmp/proname.img.aux.xml') except OSError: pass ds = gdal.Open('tmp/proname.img') srs = ds.GetProjectionRef() if srs.find('PROJCS["NAD83 / Ohio South (ftUS)",') != 0: gdaltest.post_reason('did not get expected PROJCS name.') print(srs) result = 'fail' else: result = 'success' ds = None drv.Delete('tmp/proname.img') return result ############################################################################### # Read a compressed file where no block has been written (#2523) def test_hfa_read_empty_compressed(): drv = gdal.GetDriverByName('HFA') ds = drv.Create('tmp/emptycompressed.img', 64, 64, 1, options=['COMPRESSED=YES']) ds = None ds = gdal.Open('tmp/emptycompressed.img') if ds.GetRasterBand(1).Checksum() != 0: result = 'fail' else: result = 'success' ds = None drv.Delete('tmp/emptycompressed.img') return result ############################################################################### # Verify "unique values" based color table (#2419) def test_hfa_unique_values_color_table(): ds = gdal.Open('data/hfa/i8u_c_i.img') ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct.GetCount() == 256, 'got wrong color count' assert ct.GetColorEntry(253) == (0, 0, 0, 0) and ct.GetColorEntry(254) == (255, 255, 170, 255) and ct.GetColorEntry(255) == (255, 255, 255, 255), \ 'Got wrong colors' ct = None ds = None ############################################################################### # Verify "unique values" based histogram. def test_hfa_unique_values_hist(): try: gdal.RasterAttributeTable() except: pytest.skip() ds = gdal.Open('data/hfa/i8u_c_i.img') md = ds.GetRasterBand(1).GetMetadata() expected = '12603|1|0|0|45|1|0|0|0|0|656|177|0|0|5026|1062|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|75|1|0|0|207|158|0|0|8|34|0|0|0|0|538|57|0|10|214|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|31|0|0|9|625|67|0|0|118|738|117|3004|1499|491|187|1272|513|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|3|0|0|283|123|5|1931|835|357|332|944|451|80|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|5|0|0|535|1029|118|0|33|246|342|0|0|10|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|169|439|0|0|6|990|329|0|0|120|295|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|164|42|0|0|570|966|0|0|18|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|106|0|0|16|16517|' assert md['STATISTICS_HISTOBINVALUES'] == expected, 'Unexpected HISTOBINVALUES.' assert md['STATISTICS_HISTOMIN'] == '0' and md['STATISTICS_HISTOMAX'] == '255', \ "unexpected histomin/histomax value." # lets also check the RAT to ensure it has the BinValues column added. rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat.GetColumnCount() == 6 and rat.GetTypeOfCol(0) == gdal.GFT_Real and rat.GetUsageOfCol(0) == gdal.GFU_MinMax, \ 'BinValues column wrong.' assert rat.GetValueAsInt(2, 0) == 4, 'BinValues value wrong.' rat = None ds = None ############################################################################### # Verify reading of 3rd order XFORM polynomials. def test_hfa_xforms_3rd(): ds = gdal.Open('data/hfa/42BW_420730_VT2.aux') check_list = [ ('XFORM_STEPS', 2), ('XFORM0_POLYCOEFMTX[3]', -0.151286406053458), ('XFORM0_POLYCOEFVECTOR[1]', 401692.559078924), ('XFORM1_ORDER', 3), ('XFORM1_FWD_POLYCOEFMTX[0]', -0.560405515080768), ('XFORM1_FWD_POLYCOEFMTX[17]', -1.01593898110617e-08), ('XFORM1_REV_POLYCOEFMTX[17]', 4.01319402177037e-09), ('XFORM1_REV_POLYCOEFVECTOR[0]', 2605.41812438735)] xform_md = ds.GetMetadata('XFORMS') for check_item in check_list: try: value = float(xform_md[check_item[0]]) except (TypeError, ValueError): pytest.fail('metadata item %d missing' % check_item[0]) assert value == pytest.approx(check_item[1], abs=abs(value / 100000.0)), \ ('metadata item %s has wrong value: %.15g' % (check_item[0], value)) # Check that the GCPs are as expected implying that the evaluation # function for XFORMs if working ok. gcps = ds.GetGCPs() assert gcps[0].GCPPixel == 0.5 and gcps[0].GCPLine == 0.5 and gcps[0].GCPX == pytest.approx(1667635.007, abs=0.001) and gcps[0].GCPY == pytest.approx(2620003.171, abs=0.001), \ 'GCP 0 value wrong.' assert gcps[14].GCPPixel == pytest.approx(1769.7, abs=0.1) and gcps[14].GCPLine == pytest.approx(2124.9, abs=0.1) and gcps[14].GCPX == pytest.approx(1665221.064, abs=0.001) and gcps[14].GCPY == pytest.approx(2632414.379, abs=0.001), \ 'GCP 14 value wrong.' ds = None ############################################################################### # Verify that we can clear an existing color table def test_hfa_delete_colortable(): # copy a file to tmp dir to modify. open('tmp/i8u.img', 'wb').write(open('data/hfa/i8u_c_i.img', 'rb').read()) # clear color table. ds = gdal.Open('tmp/i8u.img', gdal.GA_Update) try: ds.GetRasterBand(1).SetColorTable except: # OG python bindings don't have SetColorTable, and if we use # SetRasterColorTable, it doesn't work either as None isn't a valid # value for them ds = None gdal.GetDriverByName('HFA').Delete('tmp/i8u.img') pytest.skip() ds.GetRasterBand(1).SetColorTable(None) ds = None # check color table gone. ds = gdal.Open('tmp/i8u.img') assert ds.GetRasterBand(1).GetColorTable() is None, 'failed to remove color table' ds = None gdal.GetDriverByName('HFA').Delete('tmp/i8u.img') ############################################################################### # Verify that we can clear an existing color table (#2842) def test_hfa_delete_colortable2(): # copy a file to tmp dir to modify. src_ds = gdal.Open('../gcore/data/8bit_pal.bmp') ds = gdal.GetDriverByName('HFA').CreateCopy('tmp/hfa_delete_colortable2.img', src_ds) src_ds = None ds = None # clear color table. ds = gdal.Open('tmp/hfa_delete_colortable2.img', gdal.GA_Update) try: ds.GetRasterBand(1).SetColorTable except: # OG python bindings don't have SetColorTable, and if we use # SetRasterColorTable, it doesn't work either as None isn't a valid # value for them ds = None gdal.GetDriverByName('HFA').Delete('tmp/hfa_delete_colortable2.img') pytest.skip() ds.GetRasterBand(1).SetColorTable(None) ds = None # check color table gone. ds = gdal.Open('tmp/hfa_delete_colortable2.img') assert ds.GetRasterBand(1).GetColorTable() is None, 'failed to remove color table' ds = None gdal.GetDriverByName('HFA').Delete('tmp/hfa_delete_colortable2.img') ############################################################################### # Verify we can read the special histogram metadata from a provided image. def test_hfa_excluded_values(): ds = gdal.Open('data/hfa/dem10.img') md = ds.GetRasterBand(1).GetMetadata() ds = None assert md['STATISTICS_EXCLUDEDVALUES'] == '0,8,9', \ 'STATISTICS_EXCLUDEDVALUE is wrong.' ############################################################################### # verify that we propagate nodata to overviews in .hfa/.rrd format. def test_hfa_ov_nodata(): drv = gdal.GetDriverByName('HFA') src_ds = gdal.Open('data/aaigrid/nodata_int.asc') wrk_ds = drv.CreateCopy('/vsimem/ov_nodata.img', src_ds) src_ds = None wrk_ds.BuildOverviews(overviewlist=[2]) wrk_ds = None wrk2_ds = gdal.Open('/vsimem/ov_nodata.img') ovb = wrk2_ds.GetRasterBand(1).GetOverview(0) assert ovb.GetNoDataValue() == -99999, 'nodata not propagated to .img overview.' assert ovb.GetMaskFlags() == gdal.GMF_NODATA, 'mask flag not as expected.' # Confirm that a .ovr file was *not* produced. gdal.PushErrorHandler('CPLQuietErrorHandler') try: wrk3_ds = gdal.Open('/vsimem/ov_nodata.img.ovr') except: wrk3_ds = None gdal.PopErrorHandler() assert wrk3_ds is None, \ 'this test result is invalid since .ovr file was created, why?' wrk2_ds = None drv.Delete('/vsimem/ov_nodata.img') ############################################################################### # Confirm that we can read 8bit grayscale overviews for 1bit images. def test_hfa_read_bit2grayscale(): ds = gdal.Open('data/hfa/small1bit.img') band = ds.GetRasterBand(1) ov = band.GetOverview(0) assert ov.Checksum() == 4247, 'did not get expected overview checksum' ds_md = ds.GetMetadata() assert ds_md['PyramidResamplingType'] == 'AVERAGE_BIT2GRAYSCALE', \ 'wrong pyramid resampling type metadata.' ############################################################################### # Confirm that we can create overviews in rrd format for an .img file with # the bit2grayscale algorithm (#2914) def test_hfa_write_bit2grayscale(): import shutil shutil.copyfile('data/hfa/small1bit.img', 'tmp/small1bit.img') shutil.copyfile('data/hfa/small1bit.rrd', 'tmp/small1bit.rrd') gdal.SetConfigOption('USE_RRD', 'YES') gdal.SetConfigOption('HFA_USE_RRD', 'YES') ds = gdal.Open('tmp/small1bit.img', gdal.GA_Update) ds.BuildOverviews(resampling='average_bit2grayscale', overviewlist=[2]) ov = ds.GetRasterBand(1).GetOverview(1) assert ov.Checksum() == 57325, 'wrong checksum for greyscale overview.' ds = None gdal.GetDriverByName('HFA').Delete('tmp/small1bit.img') gdal.SetConfigOption('USE_RRD', 'NO') gdal.SetConfigOption('HFA_USE_RRD', 'NO') # as an aside, confirm the .rrd file was deleted. assert not os.path.exists('tmp/small1bit.rrd') ############################################################################### # Verify handling of camera model metadata (#2675) def test_hfa_camera_md(): ds = gdal.Open('/vsisparse/data/hfa/251_sparse.xml') md = ds.GetMetadata('CAMERA_MODEL') check_list = [('direction', 'EMOD_FORWARD'), ('forSrcAffine[0]', '0.025004093931786'), ('invDstAffine[0]', '1'), ('coeffs[1]', '-0.008'), ('elevationType', 'EPRJ_ELEVATION_TYPE_HEIGHT')] for check_item in check_list: try: value = md[check_item[0]] except IndexError: pytest.fail('metadata item %d missing' % check_item[0]) assert value == check_item[1], ('metadata item %s has wrong value: %s' % (check_item[0], value)) # Check that the SRS is reasonable. srs_wkt = md['outputProjection'] exp_wkt = 'PROJCS["UTM Zone 17, Northern Hemisphere",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],TOWGS84[-10,158,187,0,0,0,0],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-81],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1],AUTHORITY["EPSG","26717"]]' assert gdaltest.equal_srs_from_wkt(srs_wkt, exp_wkt), 'wrong outputProjection' ds = None ############################################################################### # Verify dataset's projection matches expected def hfa_verify_dataset_projection(dataset_path, exp_wkt): ds = gdal.Open(dataset_path) srs_wkt = ds.GetProjectionRef() assert gdaltest.equal_srs_from_wkt(exp_wkt, srs_wkt), 'wrong outputProjection' ds = None ############################################################################### # Verify can read Transverse Mercator (South Orientated) projections def test_hfa_read_tmso_projection(): exp_wkt = 'PROJCS["Transverse Mercator (South Orientated)",GEOGCS["Cape-1",DATUM["Cape-1",SPHEROID["Clarke 1880 Arc",6378249.145,293.4663077168331],TOWGS84[-136,-108,-292,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator_South_Orientated"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",21],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1]]' return hfa_verify_dataset_projection('../gcore/data/22281.aux', exp_wkt) ############################################################################### # Verify can write Transverse Mercator (South Orientated) projections to aux files def test_hfa_write_tmso_projection(): dataset_path = 'tmp/tmso.img' out_ds = gdal.GetDriverByName('HFA').Create(dataset_path, 1, 1) gt = (0, 1, 0, 0, 0, 1) out_ds.SetGeoTransform(gt) out_ds.SetProjection('PROJCS["Hartebeesthoek94 / Lo15",GEOGCS["Hartebeesthoek94",DATUM["Hartebeesthoek94",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6148"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4148"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator_South_Orientated"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],AUTHORITY["EPSG","2046"],AXIS["Y",WEST],AXIS["X",SOUTH]]') out_ds = None exp_wkt = 'PROJCS["Hartebeesthoek94 / Lo15",GEOGCS["Hartebeesthoek94",DATUM["Hartebeesthoek94",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6148"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4148"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator_South_Orientated"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],AUTHORITY["EPSG","2046"],AXIS["Y",WEST],AXIS["X",SOUTH]]' ret = hfa_verify_dataset_projection(dataset_path, exp_wkt) gdal.GetDriverByName('HFA').Delete(dataset_path) return ret ############################################################################### # Verify can read Hotine Oblique Mercator (Variant A) projections def test_hfa_read_homva_projection(): exp_wkt = 'PROJCS["Hotine Oblique Mercator (Variant A)",GEOGCS["GDM 2000",DATUM["Geodetic_Datum_of_Malaysia_2000",SPHEROID["GRS 1980",6378137,298.257222096042],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Hotine_Oblique_Mercator"],PARAMETER["latitude_of_center",4],PARAMETER["longitude_of_center",115],PARAMETER["azimuth",53.31580995],PARAMETER["rectified_grid_angle",53.1301023611111],PARAMETER["scale_factor",0.99984],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' ds = gdal.Open('../gcore/data/3376.tif') srs_wkt = ds.GetProjectionRef() assert gdaltest.equal_srs_from_wkt(srs_wkt, exp_wkt, verbose=False) or \ gdaltest.equal_srs_from_wkt(srs_wkt, exp_wkt.replace('Geodetic_Datum_of_Malaysia_2000', 'GDM 2000'), verbose=False), srs_wkt ############################################################################### # Verify can write Hotine Oblique Mercator (Variant A) projections to aux files def test_hfa_write_homva_projection(): dataset_path = 'tmp/homva.img' out_ds = gdal.GetDriverByName('HFA').Create(dataset_path, 1, 1) gt = (0, 1, 0, 0, 0, 1) out_ds.SetGeoTransform(gt) out_ds.SetProjection('PROJCS["Hotine Oblique Mercator (Variant A)",GEOGCS["GDM 2000",DATUM["GDM_2000",SPHEROID["GRS 1980",6378137,298.2572220960422],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator"],PARAMETER["latitude_of_center",4],PARAMETER["longitude_of_center",115],PARAMETER["azimuth",53.31580995],PARAMETER["rectified_grid_angle",53.13010236111111],PARAMETER["scale_factor",0.99984],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1]]') out_ds = None exp_wkt = 'PROJCS["Hotine Oblique Mercator (Variant A)",GEOGCS["GDM_2000",DATUM["GDM_2000",SPHEROID["GRS 1980",6378137,298.257222096042],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Hotine_Oblique_Mercator"],PARAMETER["latitude_of_center",4],PARAMETER["longitude_of_center",115],PARAMETER["azimuth",53.31580995],PARAMETER["rectified_grid_angle",53.1301023611111],PARAMETER["scale_factor",0.99984],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["meters",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' ret = hfa_verify_dataset_projection(dataset_path, exp_wkt) gdal.GetDriverByName('HFA').Delete(dataset_path) return ret ############################################################################### # Check that overviews with an .rde file are properly supported in file list, # and fetching actual overviews. def test_hfa_rde_overviews(): # Create an imagine file, forcing creation of an .ige file. ds = gdal.Open('data/hfa/spill.img') exp_cs = 1631 cs = ds.GetRasterBand(1).Checksum() assert exp_cs == cs, 'did not get expected band checksum' exp_cs = 340 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert exp_cs == cs, 'did not get expected overview checksum' filelist = ds.GetFileList() exp_filelist = ['data/hfa/spill.img', 'data/hfa/spill.ige', 'data/hfa/spill.rrd', 'data/hfa/spill.rde'] assert [x.replace('\\', '/') for x in filelist] == exp_filelist ds = None ############################################################################### # Check that we can copy and rename a complex file set, and that the internal filenames # in the .img and .rrd seem to be updated properly. def test_hfa_copyfiles(): drv = gdal.GetDriverByName('HFA') drv.CopyFiles('tmp/newnamexxx_after_copy.img', 'data/hfa/spill.img') drv.Rename('tmp/newnamexxx.img', 'tmp/newnamexxx_after_copy.img') ds = gdal.Open('tmp/newnamexxx.img') exp_cs = 340 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert exp_cs == cs, 'did not get expected overview checksum' filelist = ds.GetFileList() exp_filelist = ['tmp/newnamexxx.img', 'tmp/newnamexxx.ige', 'tmp/newnamexxx.rrd', 'tmp/newnamexxx.rde'] exp_filelist_win32 = ['tmp/newnamexxx.img', 'tmp\\newnamexxx.ige', 'tmp\\newnamexxx.rrd', 'tmp\\newnamexxx.rde'] assert filelist == exp_filelist or filelist == exp_filelist_win32, \ 'did not get expected file list.' ds = None # Check that the filenames in the actual files seem to have been updated. img = open('tmp/newnamexxx.img', 'rb').read() img = str(img) assert img.find('newnamexxx.rrd') != -1, 'RRDNames not updated?' assert img.find('newnamexxx.ige') != -1, 'spill file not updated?' rrd = open('tmp/newnamexxx.rrd', 'rb').read() rrd = str(rrd) assert rrd.find('newnamexxx.img') != -1, 'DependentFile not updated?' assert rrd.find('newnamexxx.rde') != -1, 'overview spill file not updated?' drv.Delete('tmp/newnamexxx.img') ############################################################################### # Test the ability to write a RAT (#999) def test_hfa_write_rat(): drv = gdal.GetDriverByName('HFA') src_ds = gdal.Open('data/hfa/i8u_c_i.img') rat = src_ds.GetRasterBand(1).GetDefaultRAT() dst_ds = drv.Create('tmp/write_rat.img', 100, 100, 1, gdal.GDT_Byte) dst_ds.GetRasterBand(1).SetDefaultRAT(rat) dst_ds = None src_ds = None rat = None ds = gdal.Open('tmp/write_rat.img') rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat.GetColumnCount() == 6 and rat.GetTypeOfCol(0) == gdal.GFT_Real and rat.GetUsageOfCol(0) == gdal.GFU_Generic, \ 'BinValues column wrong.' assert rat.GetValueAsInt(2, 0) == 4, 'BinValues value wrong.' assert rat.GetValueAsInt(4, 5) == 656, 'Histogram value wrong.' rat = None ds = None drv.Delete('tmp/write_rat.img') ############################################################################### # Test STATISTICS creation option def test_hfa_createcopy_statistics(): tmpAuxXml = '../gcore/data/byte.tif.aux.xml' try: os.remove(tmpAuxXml) except OSError: pass ds_src = gdal.Open('../gcore/data/byte.tif') out_ds = gdal.GetDriverByName('HFA').CreateCopy('/vsimem/byte.img', ds_src, options=['STATISTICS=YES']) del out_ds ds_src = None if os.path.exists(tmpAuxXml): os.remove(tmpAuxXml) gdal.Unlink('/vsimem/byte.img.aux.xml') ds = gdal.Open('/vsimem/byte.img') md = ds.GetRasterBand(1).GetMetadata() ds = None gdal.GetDriverByName('HFA').Delete('/vsimem/byte.img') assert md['STATISTICS_MINIMUM'] == '74', 'STATISTICS_MINIMUM is wrong.' ############################################################################### # Test GetUnitType() def test_hfa_read_elevation_units(): ds = gdal.Open('../gcore/data/erdas_cm.img') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == 'cm', 'Failed to read elevation units' ds = None ds = gdal.Open('../gcore/data/erdas_feet.img') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == 'feet', 'Failed to read elevation units' ds = None ds = gdal.Open('../gcore/data/erdas_m.img') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == 'meters', 'Failed to read elevation units' ds = None ############################################################################### # gdalautotest-3.2.2/gdrivers/bsb.py0000775000175000017500000001516014020414366015647 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: bsb.py c996a7448a74d49e673be5df06e42ad5a11845bc 2020-05-10 14:55:50 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: BSB Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal from osgeo import osr import gdaltest import pytest ############################################################################### # Test driver availability def test_bsb_0(): gdaltest.bsb_dr = gdal.GetDriverByName('BSB') if gdaltest.bsb_dr is None: pytest.skip() ############################################################################### # Test Read def test_bsb_1(): if gdaltest.bsb_dr is None: pytest.skip() tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall.kap', 1, 30321) return tst.testOpen() ############################################################################### # Test CreateCopy def test_bsb_2(): if gdaltest.bsb_dr is None: pytest.skip() md = gdaltest.bsb_dr.GetMetadata() if 'DMD_CREATIONDATATYPES' not in md: pytest.skip() tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall.kap', 1, 30321) return tst.testCreateCopy() ############################################################################### # Read a BSB with an index table at the end (#2782) # The rgbsmall_index.kap has been generated from rgbsmall.kap by moving the # data of first line from offset 2382 to offset 2384, and generating the index table # --> This is probably not a valid BSB file, but it proves that we can read the index table def test_bsb_3(): if gdaltest.bsb_dr is None: pytest.skip() tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_index.kap', 1, 30321) return tst.testOpen() ############################################################################### # Read a BSB without an index table but with 0 in the middle of line data # The rgbsmall_with_line_break.kap has been generated from rgbsmall.kap by # adding a 0 character in the middle of line data def test_bsb_4(): if gdaltest.bsb_dr is None: pytest.skip() tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_with_line_break.kap', 1, 30321) return tst.testOpen() ############################################################################### # Read a truncated BSB (at the level of the written scanline number starting a new row) def test_bsb_5(): if gdaltest.bsb_dr is None: pytest.skip() tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_truncated.kap', 1, 29696) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = tst.testOpen() gdal.PopErrorHandler() return ret ############################################################################### # Read another truncated BSB (in the middle of row data) def test_bsb_6(): if gdaltest.bsb_dr is None: pytest.skip() tst = gdaltest.GDALTest('BSB', 'bsb/rgbsmall_truncated2.kap', 1, 29696) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = tst.testOpen() gdal.PopErrorHandler() return ret ############################################################################### def test_bsb_tmerc(): if gdaltest.bsb_dr is None: pytest.skip() ds = gdal.Open('data/bsb/transverse_mercator.kap') gt = ds.GetGeoTransform() expected_gt = [28487.6637325402, 1.2711141208521637, 0.009061669923111566, 6539651.728646593, 0.015209115944776083, -1.267821834560455] assert min([gt[i] == pytest.approx(expected_gt[i], abs=1e-8 * abs(expected_gt[i])) for i in range(6)]) == True, gt expected_wkt = """PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4326"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",18.0582833333333], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["Meter",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" expected_sr = osr.SpatialReference() expected_sr.SetFromUserInput(expected_wkt) expected_sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); got_sr = ds.GetSpatialRef() assert expected_sr.IsSame(got_sr), got_sr.ExportToWkt() got_sr = ds.GetGCPSpatialRef() assert expected_sr.IsSame(got_sr), got_sr.ExportToWkt() assert ds.GetGCPCount() == 3 gcps = ds.GetGCPs() assert len(gcps) == 3 assert gcps[0].GCPPixel == 25 and \ gcps[0].GCPLine == 577 and \ gcps[0].GCPX == pytest.approx(28524.670169107143, abs=1e-5) and \ gcps[0].GCPY == pytest.approx(6538920.57567595, abs=1e-5) and \ gcps[0].GCPZ == 0 ############################################################################### def test_bsb_cutline(): if gdaltest.bsb_dr is None: pytest.skip() ds = gdal.Open('data/bsb/australia4c.kap') assert ds.GetMetadataItem('BSB_CUTLINE') == 'POLYGON ((112.72859333333334 -8.25404666666667,156.57827333333333 -7.66159166666667,164.28394166666666 -40.89653000000000,106.53042166666667 -41.14970000000000))' gdalautotest-3.2.2/gdrivers/jp2metadata.py0000775000175000017500000001613214020414366017275 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: jp2metadata.py 95cc0948a1480305ffe6eb18797c78dd6b1c8def 2020-05-10 20:34:33 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test JP2 metadata support. # Author: Even Rouault < even dot rouault @ spatialys.com > # ############################################################################### # Copyright (c) 2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import pytest ############################################################################### # Test bugfix for #5249 (Irrelevant ERDAS GeoTIFF JP2Box read) def test_jp2metadata_1(): ds = gdal.Open('data/jpeg2000/erdas_foo.jp2') if ds is None: pytest.skip() wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() assert wkt.startswith('PROJCS["ETRS89') expected_gt = (356000.0, 0.5, 0.0, 7596000.0, 0.0, -0.5) for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-5) ############################################################################### # Test Pleiades imagery metadata def test_jp2metadata_2(): # Pleiades product description http://www.cscrs.itu.edu.tr/assets/downloads/PleiadesUserGuide.pdf try: os.remove('data/jpeg2000/IMG_md_ple_R1C1.jp2.aux.xml') except OSError: pass ds = gdal.Open('data/jpeg2000/IMG_md_ple_R1C1.jp2', gdal.GA_ReadOnly) if ds is None: pytest.skip() filelist = ds.GetFileList() assert len(filelist) == 3, filelist mddlist = ds.GetMetadataDomainList() assert 'IMD' in mddlist and 'RPC' in mddlist and 'IMAGERY' in mddlist, \ 'did not get expected metadata list.' md = ds.GetMetadata('IMAGERY') assert 'SATELLITEID' in md, 'SATELLITEID not present in IMAGERY Domain' assert 'CLOUDCOVER' in md, 'CLOUDCOVER not present in IMAGERY Domain' assert 'ACQUISITIONDATETIME' in md, \ 'ACQUISITIONDATETIME not present in IMAGERY Domain' ds = None assert not os.path.exists('data/jpeg2000/IMG_md_ple_R1C1.jp2.aux.xml') ############################################################################### # Test reading GMLJP2 file with srsName only on the Envelope, and lots of other # metadata junk. This file is also handled currently with axis reordering # disabled. def test_jp2metadata_3(): gdal.SetConfigOption('GDAL_IGNORE_AXIS_ORIENTATION', 'YES') exp_wkt = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' ds = gdal.Open('data/jpeg2000/ll.jp2') if ds is None: gdal.SetConfigOption('GDAL_IGNORE_AXIS_ORIENTATION', 'NO') pytest.skip() wkt = ds.GetProjection() if wkt != exp_wkt: print('got: ', wkt) print('exp: ', exp_wkt) pytest.fail('did not get expected WKT, should be WGS84') gt = ds.GetGeoTransform() if gt[0] != pytest.approx(8, abs=0.0000001) or gt[3] != pytest.approx(50, abs=0.000001) \ or gt[1] != pytest.approx(0.000761397164, abs=0.000000000005) \ or gt[2] != pytest.approx(0.0, abs=0.000000000005) \ or gt[4] != pytest.approx(0.0, abs=0.000000000005) \ or gt[5] != pytest.approx(-0.000761397164, abs=0.000000000005): print('got: ', gt) pytest.fail('did not get expected geotransform') ds = None gdal.SetConfigOption('GDAL_IGNORE_AXIS_ORIENTATION', 'NO') ############################################################################### # Test reading a file with axis orientation set properly for an alternate # axis order coordinate system (urn:...:EPSG::4326). def test_jp2metadata_4(): exp_wkt = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' ds = gdal.Open('data/jpeg2000/gmljp2_dtedsm_epsg_4326_axes.jp2') if ds is None: pytest.skip() wkt = ds.GetProjection() if wkt != exp_wkt: print('got: ', wkt) print('exp: ', exp_wkt) pytest.fail('did not get expected WKT, should be WGS84') gt = ds.GetGeoTransform() gte = (42.999583333333369, 0.008271349862259, 0, 34.000416666666631, 0, -0.008271349862259) if gt[0] != pytest.approx(gte[0], abs=0.0000001) or gt[3] != pytest.approx(gte[3], abs=0.000001) \ or gt[1] != pytest.approx(gte[1], abs=0.000000000005) \ or gt[2] != pytest.approx(gte[2], abs=0.000000000005) \ or gt[4] != pytest.approx(gte[4], abs=0.000000000005) \ or gt[5] != pytest.approx(gte[5], abs=0.000000000005): print('got: ', gt) pytest.fail('did not get expected geotransform') ds = None ############################################################################### # Test reading a file with EPSG axis orientation being northing, easting, # but with explicit axisName being easting, northing (#5960) def test_jp2metadata_5(): ds = gdal.Open('data/jpeg2000/gmljp2_epsg3035_easting_northing.jp2') if ds is None: pytest.skip() sr = ds.GetSpatialRef() assert sr.GetAuthorityCode(None) == '3035' gt = ds.GetGeoTransform() gte = (4895766.000000001, 2.0, 0.0, 2296946.0, 0.0, -2.0) if gt[0] != pytest.approx(gte[0], abs=0.0000001) or gt[3] != pytest.approx(gte[3], abs=0.000001) \ or gt[1] != pytest.approx(gte[1], abs=0.000000000005) \ or gt[2] != pytest.approx(gte[2], abs=0.000000000005) \ or gt[4] != pytest.approx(gte[4], abs=0.000000000005) \ or gt[5] != pytest.approx(gte[5], abs=0.000000000005): print('got: ', gt) pytest.fail('did not get expected geotransform') ds = None gdalautotest-3.2.2/gdrivers/vrtfilt.py0000775000175000017500000001551414020414366016576 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: vrtfilt.py 3ea1cb89d5dccaea43fecf7aa9aee474abd27f8a 2020-05-10 16:21:22 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test VRT driver based filtering. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2008-2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Verify simple 3x3 averaging filter. def test_vrtfilt_1(): tst = gdaltest.GDALTest('VRT', 'vrt/avfilt.vrt', 1, 21890) return tst.testOpen() ############################################################################### # Verify simple 3x3 averaging filter (normalized) on a dataset with nodata def test_vrtfilt_2(): ds = gdal.Open('data/vrt/test_vrt_filter_nodata.tif') checksum = ds.GetRasterBand(1).Checksum() ds = None # This is a black&white checkboard, where black = nodata # Thus averaging it and taking nodata into account will not change it tst = gdaltest.GDALTest('VRT', 'vrt/avfilt_nodata.vrt', 1, checksum) return tst.testOpen() ############################################################################### # Try SetMetadataItem('source_0', xml, 'vrt_sources') (fix for #3052). # Same result expected as for vrtfilt_1 def test_vrtfilt_3(): ds = gdal.OpenShared('data/rgbsmall.tif') vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) ds = None filterSourceXML = """ data/rgbsmall.tif 1 3 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 """ try: vrt_ds.GetRasterBand(1).SetMetadataItem except: pytest.skip() vrt_ds.GetRasterBand(1).SetMetadataItem('source_0', filterSourceXML, 'vrt_sources') assert vrt_ds.GetRasterBand(1).Checksum() == 21890 ############################################################################### # Variant for SetMetadataItem('source_0', xml, 'vrt_sources') def test_vrtfilt_4(): vrt_ds = gdal.GetDriverByName('VRT').Create('', 50, 50, 1) filterSourceXML = """ data/rgbsmall.tif 1 3 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 """ try: vrt_ds.GetRasterBand(1).SetMetadataItem except: pytest.skip() vrt_ds.GetRasterBand(1).SetMetadataItem('source_0', filterSourceXML, 'new_vrt_sources') assert vrt_ds.GetRasterBand(1).Checksum() == 21890 ############################################################################### # Variant for SetMetadata(md, 'vrt_sources') def test_vrtfilt_5(): vrt_ds = gdal.GetDriverByName('VRT').Create('', 50, 50, 1) filterSourceXML = """ data/rgbsmall.tif 1 3 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 """ md = {} md['source_0'] = filterSourceXML vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') assert vrt_ds.GetRasterBand(1).Checksum() == 21890 ############################################################################### # Verify separable Gaussian blur filter. def test_vrtfilt_6(): tst = gdaltest.GDALTest('VRT', 'vrt/avfilt_1d.vrt', 1, 22377) return tst.testOpen() ############################################################################### # Test block access def test_vrtfilt_7(): gdal.Translate('/vsimem/src.tif', 'data/rgbsmall.tif', options='-outsize 500 500 -r bilinear') vrt_ds = gdal.GetDriverByName('VRT').Create('/vsimem/src.vrt', 500, 500, 1) filterSourceXML = """ /vsimem/src.tif 1 3 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 """ md = {} md['source_0'] = filterSourceXML vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') ref_checksum = vrt_ds.GetRasterBand(1).Checksum() vrt_ds = None # Wrap our above VRT in a VRT that will use 128x128 blocks # (use of -mo FOO=BAR forces a non trivial copy to be made) out_ds = gdal.Translate('', '/vsimem/src.vrt', options='-of VRT -mo FOO=BAR') assert ref_checksum == out_ds.GetRasterBand(1).Checksum() out_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/src.tif') gdal.GetDriverByName('VRT').Delete('/vsimem/src.vrt') ############################################################################### # Cleanup. def test_vrtfilt_cleanup(): pass gdalautotest-3.2.2/gdrivers/doq2.py0000775000175000017500000000544614020414366015754 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: doq2.py 7d1e60959f03a1f1a6de74dd5c63c2fd6f57ef5b 2020-05-10 17:40:47 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for DOQ2 driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal ############################################################################### # Read a truncated and modified version of C3607614.NWS # downloaded from http://edcftp.cr.usgs.gov/pub/data/samples/doq-clr-native.tar.gz def test_doq2_1(): ds = gdal.Open('data/doq2/C3607614_truncated.NWS') mem_ds = gdal.GetDriverByName('MEM').Create('mem_1.mem', 500, 1, gdal.GDT_Byte, 1) mem_ds.GetRasterBand(1).WriteRaster(0, 0, 500, 1, ds.GetRasterBand(1).ReadRaster(0, 0, 500, 1)) assert mem_ds.GetRasterBand(1).Checksum() == 4201, 'wrong checksum for band 1' mem_ds.GetRasterBand(1).WriteRaster(0, 0, 500, 1, ds.GetRasterBand(2).ReadRaster(0, 0, 500, 1)) assert mem_ds.GetRasterBand(1).Checksum() == 4010, 'wrong checksum for band 2' mem_ds.GetRasterBand(1).WriteRaster(0, 0, 500, 1, ds.GetRasterBand(3).ReadRaster(0, 0, 500, 1)) assert mem_ds.GetRasterBand(1).Checksum() == 5820, 'wrong checksum for band 3' assert ds.GetGeoTransform() == (377054, 1, 0, 4082205, 0, -1), 'wrong geotransform' md = ds.GetMetadata() assert md['QUADRANGLE_NAME'] == 'NORFOLK SOUTH 3.45 or 7.5-min. name*', \ 'wrong metadata' mem_ds = None ds = None gdalautotest-3.2.2/gdrivers/ace2.py0000775000175000017500000000511214020414366015707 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ace2.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ACE2 driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Test a fake ACE2 dataset def test_ace2_1(): f = gdal.VSIFOpenL('/vsimem/45N015E_5M.ACE2', 'wb') gdal.VSIFSeekL(f, 180 * 180 * 4 - 1, 0) gdal.VSIFWriteL('\0', 1, 1, f) gdal.VSIFCloseL(f) tst = gdaltest.GDALTest('ACE2', '/vsimem/45N015E_5M.ACE2', 1, 0, filename_absolute=1) expected_gt = [15.0, 0.08333333333333333, 0.0, 60.0, 0.0, -0.08333333333333333] expected_srs = """GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4326"]]""" ret = tst.testOpen(check_gt=expected_gt, check_prj=expected_srs) gdal.Unlink('/vsimem/45N015E_5M.ACE2') return ret gdalautotest-3.2.2/gdrivers/jpeg.py0000775000175000017500000011764514020414366016041 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: jpeg.py bea4fa685e238e3815de72b3b86106bc02b5ab34 2020-05-10 18:14:06 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test JPEG format driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # Copyright (c) 2008-2014, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import sys import shutil import struct import gdaltest from osgeo import gdal from osgeo import gdalconst import pytest ############################################################################### # Perform simple read test. def test_jpeg_1(): ds = gdal.Open('data/jpeg/albania.jpg') cs = ds.GetRasterBand(2).Checksum() if cs == 34296: gdaltest.jpeg_version = '9b' elif cs == 34298: gdaltest.jpeg_version = '8' else: gdaltest.jpeg_version = 'pre8' ds = None if gdaltest.jpeg_version == '9b': tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 34296) elif gdaltest.jpeg_version == '8': tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 34298) else: tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 17016) return tst.testOpen() ############################################################################### # Verify EXIF metadata, color interpretation and image_structure def test_jpeg_2(): ds = gdal.Open('data/jpeg/albania.jpg') md = ds.GetMetadata() ds.GetFileList() try: assert (not (md['EXIF_GPSLatitudeRef'] != 'N' or md['EXIF_GPSLatitude'] != '(41) (1) (22.91)' or md['EXIF_PixelXDimension'] != '361' or md['EXIF_GPSVersionID'] != '0x02 0x00 0x00 0x00' or md['EXIF_ExifVersion'] != '0210' or md['EXIF_XResolution'] != '(96)')), 'Exif metadata wrong.' except KeyError: print(md) pytest.fail('Exit metadata apparently missing.') assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ 'Did not get expected color interpretation.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert 'INTERLEAVE' in md and md['INTERLEAVE'] == 'PIXEL', \ 'missing INTERLEAVE metadata' assert 'COMPRESSION' in md and md['COMPRESSION'] == 'JPEG', \ 'missing INTERLEAVE metadata' md = ds.GetRasterBand(3).GetMetadata('IMAGE_STRUCTURE') assert 'COMPRESSION' in md and md['COMPRESSION'] == 'JPEG', \ 'missing INTERLEAVE metadata' ############################################################################### # Create simple copy and check (greyscale) using progressive option. def test_jpeg_3(): ds = gdal.Open('data/byte.tif') options = ['PROGRESSIVE=YES', 'QUALITY=50', 'WORLDFILE=YES'] ds = gdal.GetDriverByName('JPEG').CreateCopy('tmp/byte.jpg', ds, options=options) # IJG, MozJPEG expected_cs = [4794, 4787] assert ds.GetRasterBand(1).Checksum() in expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_GrayIndex, \ 'Wrong color interpretation.' expected_gt = [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0] gt = ds.GetGeoTransform() for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-6), 'did not get expected geotransform from PAM' ds = None os.unlink('tmp/byte.jpg.aux.xml') try: os.stat('tmp/byte.wld') except OSError: pytest.fail('should have .wld file at that point') ds = gdal.Open('tmp/byte.jpg') expected_gt = [440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0] gt = ds.GetGeoTransform() for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-6), \ 'did not get expected geotransform from .wld' ds = None ds = gdal.Open('tmp/byte.jpg') ds.GetFileList() ds = None gdal.GetDriverByName('JPEG').Delete('tmp/byte.jpg') assert not os.path.exists('tmp/byte.wld') ############################################################################### # Verify masked jpeg. def test_jpeg_4(): try: gdalconst.GMF_ALL_VALID except AttributeError: pytest.skip() ds = gdal.Open('data/jpeg/masked.jpg') refband = ds.GetRasterBand(1) assert refband.GetMaskFlags() == gdalconst.GMF_PER_DATASET, 'wrong mask flags' cs = refband.GetMaskBand().Checksum() assert cs == 770, 'Wrong mask checksum' ############################################################################### # Verify CreateCopy() of masked jpeg. def test_jpeg_5(): try: gdalconst.GMF_ALL_VALID except AttributeError: pytest.skip() ds = gdal.Open('data/jpeg/masked.jpg') ds2 = gdal.GetDriverByName('JPEG').CreateCopy('tmp/masked.jpg', ds) refband = ds2.GetRasterBand(1) assert refband.GetMaskFlags() == gdalconst.GMF_PER_DATASET, 'wrong mask flags' cs = refband.GetMaskBand().Checksum() assert cs == 770, 'Wrong checksum on copied images mask.' refband = None ds2 = None gdal.GetDriverByName('JPEG').Delete('tmp/masked.jpg') ############################################################################### # Verify ability to open file with corrupt metadata (#1904). Note the file # data/jpeg/vophead.jpg is truncated to keep the size small, but this should # not affect opening the file which just reads the header. def test_jpeg_6(): ds = gdal.Open('data/jpeg/vophead.jpg') # Because of the optimization in r17446, we shouldn't yet get this error. assert (not (gdal.GetLastErrorType() == 2 and gdal.GetLastErrorMsg().find('Ignoring EXIF') != -1)), 'got error too soon.' with gdaltest.error_handler('CPLQuietErrorHandler'): # Get this warning: # Ignoring EXIF directory with unlikely entry count (65499). md = ds.GetMetadata() # Did we get an exif related warning? assert (not (gdal.GetLastErrorType() != 2 or gdal.GetLastErrorMsg().find('Ignoring EXIF') == -1)), \ 'did not get expected error.' assert len(md) == 1 and md['EXIF_Software'] == 'IrfanView', \ 'did not get expected metadata.' ds = None ############################################################################### # Test creating an in memory copy. def test_jpeg_7(): ds = gdal.Open('data/byte.tif') options = ['PROGRESSIVE=YES', 'QUALITY=50'] ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/byte.jpg', ds, options=options) # IJG, MozJPEG expected_cs = [4794, 4787] assert ds.GetRasterBand(1).Checksum() in expected_cs, \ 'Wrong checksum on copied image.' ds = None gdal.GetDriverByName('JPEG').Delete('/vsimem/byte.jpg') ############################################################################### # Read a CMYK image as a RGB image def test_jpeg_8(): ds = gdal.Open('data/jpeg/rgb_ntf_cmyk.jpg') expected_cs = 20385 assert ds.GetRasterBand(1).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ 'Wrong color interpretation.' expected_cs = 20865 assert ds.GetRasterBand(2).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ 'Wrong color interpretation.' expected_cs = 19441 assert ds.GetRasterBand(3).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ 'Wrong color interpretation.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert 'SOURCE_COLOR_SPACE' in md and md['SOURCE_COLOR_SPACE'] == 'CMYK', \ 'missing SOURCE_COLOR_SPACE metadata' ############################################################################### # Read a CMYK image as a CMYK image def test_jpeg_9(): gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') ds = gdal.Open('data/jpeg/rgb_ntf_cmyk.jpg') gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'YES') expected_cs = 21187 assert ds.GetRasterBand(1).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand, \ 'Wrong color interpretation.' expected_cs = 21054 assert ds.GetRasterBand(2).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_MagentaBand, \ 'Wrong color interpretation.' expected_cs = 21499 assert ds.GetRasterBand(3).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_YellowBand, \ 'Wrong color interpretation.' expected_cs = 21069 assert ds.GetRasterBand(4).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_BlackBand, \ 'Wrong color interpretation.' ############################################################################### # Check reading a 12-bit JPEG def test_jpeg_10(): if gdaltest.jpeg_version == '9b': # Fails for some reason pytest.skip() # Check if JPEG driver supports 12bit JPEG reading/writing drv = gdal.GetDriverByName('JPEG') md = drv.GetMetadata() if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() try: os.remove('data/jpeg/12bit_rose_extract.jpg.aux.xml') except OSError: pass ds = gdal.Open('data/jpeg/12bit_rose_extract.jpg') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 3613 and stats[2] <= 3614 ds = None try: os.remove('data/jpeg/12bit_rose_extract.jpg.aux.xml') except OSError: pass ############################################################################### # Check creating a 12-bit JPEG def test_jpeg_11(): if gdaltest.jpeg_version == '9b': # Fails for some reason pytest.skip() # Check if JPEG driver supports 12bit JPEG reading/writing drv = gdal.GetDriverByName('JPEG') md = drv.GetMetadata() if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() ds = gdal.Open('data/jpeg/12bit_rose_extract.jpg') out_ds = gdal.GetDriverByName('JPEG').CreateCopy('tmp/jpeg11.jpg', ds) del out_ds ds = gdal.Open('tmp/jpeg11.jpg') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 3613 and stats[2] <= 3614 ds = None gdal.GetDriverByName('JPEG').Delete('tmp/jpeg11.jpg') ############################################################################### # Test reading a stored JPEG in ZIP (#3908) def test_jpeg_12(): ds = gdal.Open('/vsizip/data/jpeg/byte_jpg.zip') assert ds is not None gdal.ErrorReset() ds.GetRasterBand(1).Checksum() assert gdal.GetLastErrorMsg() == '' gdal.ErrorReset() ds.GetRasterBand(1).GetMaskBand().Checksum() assert gdal.GetLastErrorMsg() == '' ds = None ############################################################################### # Test writing to /vsistdout/ def test_jpeg_13(): src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsistdout_redirect//vsimem/tmp.jpg', src_ds) assert ds.GetRasterBand(1).Checksum() == 0 ds.ReadRaster(0, 0, 1, 1) src_ds = None ds = None ds = gdal.Open('/vsimem/tmp.jpg') assert ds is not None gdal.Unlink('/vsimem/tmp.jpg') ############################################################################### # Test writing to /vsistdout/ def test_jpeg_14(): if gdaltest.jpeg_version == '9b': # Fails for some reason pytest.skip() # Check if JPEG driver supports 12bit JPEG reading/writing drv = gdal.GetDriverByName('JPEG') md = drv.GetMetadata() if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() src_ds = gdal.Open('data/jpeg/12bit_rose_extract.jpg') ds = drv.CreateCopy('/vsistdout_redirect//vsimem/tmp.jpg', src_ds) assert ds.GetRasterBand(1).Checksum() == 0 src_ds = None ds = None ds = gdal.Open('/vsimem/tmp.jpg') assert ds is not None gdal.Unlink('/vsimem/tmp.jpg') ############################################################################### # Test CreateCopy() interruption def test_jpeg_15(): tst = gdaltest.GDALTest('JPEG', 'jpeg/albania.jpg', 2, 17016) return tst.testCreateCopy(vsimem=1, interrupt_during_copy=True) ############################################################################### # Test overview support def test_jpeg_16(): shutil.copy('data/jpeg/albania.jpg', 'tmp/albania.jpg') gdal.Unlink('tmp/albania.jpg.ovr') ds = gdal.Open('tmp/albania.jpg') assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(1) is None assert ds.GetRasterBand(1).GetOverview(0) is not None # "Internal" overview cs = ds.GetRasterBand(1).GetOverview(0).Checksum() if gdaltest.jpeg_version in ('8', '9b'): expected_cs = 34218 else: expected_cs = 31892 assert cs == expected_cs # Build external overviews ds.BuildOverviews('NEAR', [2, 4]) assert ds.GetRasterBand(1).GetOverviewCount() == 2 # Check updated checksum cs = ds.GetRasterBand(1).GetOverview(0).Checksum() if gdaltest.jpeg_version in ('8', '9b'): expected_cs = 33698 else: expected_cs = 32460 assert cs == expected_cs ds = None # Check we are using external overviews ds = gdal.Open('tmp/albania.jpg') assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() if gdaltest.jpeg_version in ('8', '9b'): expected_cs = 33698 else: expected_cs = 32460 assert cs == expected_cs ds = None ############################################################################### # Test bogus files def test_jpeg_17(): gdal.ErrorReset() with gdaltest.error_handler('CPLQuietErrorHandler'): ds = gdal.Open('data/jpeg/bogus.jpg') assert (not (ds is not None or gdal.GetLastErrorType() != gdal.CE_Failure or gdal.GetLastErrorMsg() == '')) gdal.ErrorReset() ds = gdal.Open('data/jpeg/byte_corrupted.jpg') with gdaltest.error_handler('CPLQuietErrorHandler'): # ERROR 1: libjpeg: Huffman table 0x00 was not defined cs = ds.GetRasterBand(1).Checksum() if (gdal.GetLastErrorType() != gdal.CE_Failure or gdal.GetLastErrorMsg() == ''): # libjpeg-turbo 1.4.0 doesn't emit errors... assert cs == 4925 gdal.ErrorReset() ds = gdal.Open('data/jpeg/byte_corrupted2.jpg') with gdaltest.error_handler('CPLQuietErrorHandler'): # Get this warning: # libjpeg: Corrupt JPEG data: found marker 0x00 instead of RST63 ds.GetRasterBand(1).Checksum() assert (not (gdal.GetLastErrorType() != gdal.CE_Warning or gdal.GetLastErrorMsg() == '')) gdal.ErrorReset() ds = gdal.Open('data/jpeg/byte_corrupted2.jpg') with gdaltest.error_handler('CPLQuietErrorHandler'): gdal.SetConfigOption('GDAL_ERROR_ON_LIBJPEG_WARNING', 'TRUE') # Get this ERROR 1: # libjpeg: Corrupt JPEG data: found marker 0x00 instead of RST63 ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_ERROR_ON_LIBJPEG_WARNING', None) assert (not (gdal.GetLastErrorType() != gdal.CE_Failure or gdal.GetLastErrorMsg() == '')) ############################################################################### # Test situation where we cause a restart and need to reset scale def test_jpeg_18(): height = 1024 width = 1024 src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/jpeg_18.tif', width, height, 1) for i in range(height): data = struct.pack('B' * 1, int(i / (height / 256))) src_ds.WriteRaster(0, i, width, 1, data, 1, 1) ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/jpeg_18.jpg', src_ds, options=['QUALITY=99']) src_ds = None gdal.Unlink('/vsimem/jpeg_18.tif') oldSize = gdal.GetCacheMax() gdal.SetCacheMax(0) line0 = ds.GetRasterBand(1).ReadRaster(0, 0, width, 1) data = struct.unpack('B' * width, line0) assert data[0] == pytest.approx(0, abs=10) line1023 = ds.GetRasterBand(1).ReadRaster(0, height - 1, width, 1) data = struct.unpack('B' * width, line1023) assert data[0] == pytest.approx(255, abs=10) line0_ovr1 = ds.GetRasterBand(1).GetOverview(1).ReadRaster(0, 0, int(width / 4), 1) data = struct.unpack('B' * (int(width / 4)), line0_ovr1) assert data[0] == pytest.approx(0, abs=10) line1023_bis = ds.GetRasterBand(1).ReadRaster(0, height - 1, width, 1) assert line1023_bis != line0 and line1023 == line1023_bis line0_bis = ds.GetRasterBand(1).ReadRaster(0, 0, width, 1) assert line0 == line0_bis line255_ovr1 = ds.GetRasterBand(1).GetOverview(1).ReadRaster( 0, int(height / 4) - 1, int(width / 4), 1) data = struct.unpack('B' * int(width / 4), line255_ovr1) assert data[0] == pytest.approx(255, abs=10) line0_bis = ds.GetRasterBand(1).ReadRaster(0, 0, width, 1) assert line0 == line0_bis line0_ovr1_bis = ds.GetRasterBand(1).GetOverview(1).ReadRaster( 0, 0, int(width / 4), 1) assert line0_ovr1 == line0_ovr1_bis line255_ovr1_bis = ds.GetRasterBand(1).GetOverview(1).ReadRaster( 0, int(height / 4) - 1, int(width / 4), 1) assert line255_ovr1 == line255_ovr1_bis gdal.SetCacheMax(oldSize) ds = None gdal.Unlink('/vsimem/jpeg_18.jpg') ############################################################################### # Test MSB ordering of bits in mask (#5102) def test_jpeg_19(): for width, height, iX in [(32, 32, 12), (25, 25, 8), (24, 25, 8)]: src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/jpeg_19.tif', width, height, 1) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) src_ds.GetRasterBand(1).GetMaskBand().WriteRaster( 0, 0, iX, height, struct.pack('B' * 1, 255), 1, 1) src_ds.GetRasterBand(1).GetMaskBand().WriteRaster( iX, 0, width - iX, height, struct.pack('B' * 1, 0), 1, 1) tiff_mask_data = src_ds.GetRasterBand(1).GetMaskBand().ReadRaster( 0, 0, width, height) # Generate a JPEG file with a (default) LSB bit mask order out_ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/jpeg_19.jpg', src_ds) out_ds = None # Generate a JPEG file with a MSB bit mask order gdal.SetConfigOption('JPEG_WRITE_MASK_BIT_ORDER', 'MSB') out_ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/jpeg_19_msb.jpg', src_ds) del out_ds gdal.SetConfigOption('JPEG_WRITE_MASK_BIT_ORDER', None) src_ds = None # Check that the file are indeed different statBuf = gdal.VSIStatL('/vsimem/jpeg_19.jpg') f = gdal.VSIFOpenL('/vsimem/jpeg_19.jpg', 'rb') data1 = gdal.VSIFReadL(1, statBuf.size, f) gdal.VSIFCloseL(f) statBuf = gdal.VSIStatL('/vsimem/jpeg_19_msb.jpg') f = gdal.VSIFOpenL('/vsimem/jpeg_19_msb.jpg', 'rb') data2 = gdal.VSIFReadL(1, statBuf.size, f) gdal.VSIFCloseL(f) if (width, height, iX) == (24, 25, 8): assert data1 == data2 else: assert data1 != data2 # Check the file with the LSB bit mask order ds = gdal.Open('/vsimem/jpeg_19.jpg') jpg_mask_data = ds.GetRasterBand(1).GetMaskBand().ReadRaster( 0, 0, width, height) ds = None assert tiff_mask_data == jpg_mask_data # Check the file with the MSB bit mask order ds = gdal.Open('/vsimem/jpeg_19_msb.jpg') jpg_mask_data = ds.GetRasterBand(1).GetMaskBand().ReadRaster( 0, 0, width, height) ds = None assert tiff_mask_data == jpg_mask_data gdal.GetDriverByName('GTiff').Delete('/vsimem/jpeg_19.tif') gdal.GetDriverByName('JPEG').Delete('/vsimem/jpeg_19.jpg') gdal.GetDriverByName('JPEG').Delete('/vsimem/jpeg_19_msb.jpg') ############################################################################### # Test correct GCP reading with PAM (#5352) def test_jpeg_20(): src_ds = gdal.Open('data/rgb_gcp.vrt') ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/jpeg_20.jpg', src_ds) ds = None ds = gdal.Open('/vsimem/jpeg_20.jpg') assert ds.GetGCPProjection().find('GEOGCS["WGS 84"') == 0 assert ds.GetGCPCount() == 4 assert len(ds.GetGCPs()) == 4 ds = None gdal.GetDriverByName('JPEG').Delete('/vsimem/jpeg_20.jpg') ############################################################################### # Test implicit and EXIF overviews def test_jpeg_21(): ds = gdal.Open('data/jpeg/black_with_white_exif_ovr.jpg') assert ds.GetRasterBand(1).GetOverviewCount() == 3 expected_dim_cs = [[512, 512, 0], [256, 256, 0], [196, 196, 12681]] i = 0 for expected_w, expected_h, expected_cs in expected_dim_cs: ovr = ds.GetRasterBand(1).GetOverview(i) cs = ovr.Checksum() assert (not (ovr.XSize != expected_w or ovr.YSize != expected_h or cs != expected_cs)) i = i + 1 ds = None ############################################################################### # Test generation of EXIF overviews def test_jpeg_22(): src_ds = gdal.GetDriverByName('Mem').Create('', 4096, 2048) src_ds.GetRasterBand(1).Fill(255) ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/jpeg_22.jpg', src_ds, options=['EXIF_THUMBNAIL=YES']) src_ds = None assert ds.GetRasterBand(1).GetOverviewCount() == 4 ovr = ds.GetRasterBand(1).GetOverview(3) cs = ovr.Checksum() assert ovr.XSize == 128 and ovr.YSize == 64 and cs == 34957 ds = None # With 3 bands src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096, 3) src_ds.GetRasterBand(1).Fill(255) ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/jpeg_22.jpg', src_ds, options=['EXIF_THUMBNAIL=YES']) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) assert ovr.XSize == 64 and ovr.YSize == 128 ds = None # With comment src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096) src_ds.GetRasterBand(1).Fill(255) ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/jpeg_22.jpg', src_ds, options=['COMMENT=foo', 'EXIF_THUMBNAIL=YES', 'THUMBNAIL_WIDTH=40']) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) assert ds.GetMetadataItem('COMMENT') == 'foo' assert ovr.XSize == 40 and ovr.YSize == 80 ds = None src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096) src_ds.GetRasterBand(1).Fill(255) ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/jpeg_22.jpg', src_ds, options=['EXIF_THUMBNAIL=YES', 'THUMBNAIL_HEIGHT=60']) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) assert ovr.XSize == 30 and ovr.YSize == 60 ds = None src_ds = gdal.GetDriverByName('Mem').Create('', 2048, 4096) src_ds.GetRasterBand(1).Fill(255) ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/jpeg_22.jpg', src_ds, options=['EXIF_THUMBNAIL=YES', 'THUMBNAIL_WIDTH=50', 'THUMBNAIL_HEIGHT=40']) src_ds = None ovr = ds.GetRasterBand(1).GetOverview(3) assert ovr.XSize == 50 and ovr.YSize == 40 ds = None gdal.Unlink('/vsimem/jpeg_22.jpg') ############################################################################### # Test optimized JPEG IRasterIO def test_jpeg_23(): ds = gdal.Open('data/jpeg/albania.jpg') cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] # Band interleaved data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) tmp_ds = gdal.GetDriverByName('Mem').Create( '', ds.RasterXSize, ds.RasterYSize, 3) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == got_cs # Pixel interleaved ds = gdal.Open('data/jpeg/albania.jpg') data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=3, buf_band_space=1) y = int(ds.RasterYSize/2) data_bottom = ds.ReadRaster(0, y, ds.RasterXSize, ds.RasterYSize - y, buf_pixel_space=3, buf_band_space=1) data_top = ds.ReadRaster(0, 0, ds.RasterXSize, y, buf_pixel_space=3, buf_band_space=1) assert data == data_top + data_bottom tmp_ds = gdal.GetDriverByName('Mem').Create( '', ds.RasterXSize, ds.RasterYSize, 3) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=3, buf_band_space=1) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == got_cs # Pixel interleaved with padding ds = gdal.Open('data/jpeg/albania.jpg') data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=4, buf_band_space=1) tmp_ds = gdal.GetDriverByName('Mem').Create( '', ds.RasterXSize, ds.RasterYSize, 3) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=4, buf_band_space=1) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == got_cs ############################################################################### # Test Arithmetic coding (and if not enabled, will trigger error code handling # in CreateCopy()) def test_jpeg_24(): has_arithmetic = bool(gdal.GetDriverByName('JPEG').GetMetadataItem( 'DMD_CREATIONOPTIONLIST').find('ARITHMETIC') >= 0) src_ds = gdal.Open('data/byte.tif') if not has_arithmetic: gdal.PushErrorHandler() ds = gdal.GetDriverByName('JPEG').CreateCopy('/vsimem/byte.jpg', src_ds, options=['ARITHMETIC=YES']) if not has_arithmetic: gdal.PopErrorHandler() else: if gdal.GetLastErrorMsg().find('Requested feature was omitted at compile time') >= 0: ds = None gdal.Unlink('/vsimem/byte.jpg') pytest.skip() expected_cs = 4743 assert ds.GetRasterBand(1).Checksum() == expected_cs, \ 'Wrong checksum on copied image.' ds = None gdal.GetDriverByName('JPEG').Delete('/vsimem/byte.jpg') ############################################################################### # Test COMMENT def test_jpeg_25(): src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/byte.jpg', src_ds, options=['COMMENT=my comment']) ds = None ds = gdal.Open('/vsimem/byte.jpg') if ds.GetMetadataItem('COMMENT') != 'my comment': print(ds.GetMetadata()) pytest.fail('Wrong comment.') ds = None gdal.GetDriverByName('JPEG').Delete('/vsimem/byte.jpg') ############################################################################### # Test creation error def test_jpeg_26(): src_ds = gdal.GetDriverByName('Mem').Create('', 70000, 1) with gdaltest.error_handler(): ds = gdal.GetDriverByName('JPEG').CreateCopy( '/vsimem/jpeg_26.jpg', src_ds) assert ds is None gdal.Unlink('/vsimem/jpeg_26.jpg') ############################################################################### # Test reading a file that contains the 2 denial of service # vulnerabilities listed in # http://www.libjpeg-jpeg_26.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf def test_jpeg_27_max_memory(): # Fails for some reason on Windows. if sys.platform == 'win32': pytest.skip() # Should error out with 'Reading this image would require # libjpeg to allocate at least...' gdal.ErrorReset() with gdaltest.error_handler(): os.environ['JPEGMEM'] = '10M' gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', '1000') ds = gdal.Open('/vsisubfile/146,/vsizip/../gcore/data/eofloop_valid_huff.tif.zip') cs = ds.GetRasterBand(1).Checksum() del os.environ['JPEGMEM'] gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', None) assert cs == 0 and gdal.GetLastErrorMsg() != '' def test_jpeg_27_max_scan_number(): # Should error out with 'Scan number... gdal.ErrorReset() ds = gdal.Open('/vsisubfile/146,/vsizip/../gcore/data/eofloop_valid_huff.tif.zip') with gdaltest.error_handler(): gdal.SetConfigOption('GDAL_ALLOW_LARGE_LIBJPEG_MEM_ALLOC', 'YES') gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', '10') cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_ALLOW_LARGE_LIBJPEG_MEM_ALLOC', None) gdal.SetConfigOption('GDAL_JPEG_MAX_ALLOWED_SCAN_NUMBER', None) assert cs == 0 and gdal.GetLastErrorMsg() != '' ############################################################################### # Test writing of EXIF and GPS tags def test_jpeg_28(): tmpfilename = '/vsimem/jpeg_28.jpg' # Nothing src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ds = gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None ds = gdal.Open(tmpfilename) assert not ds.GetMetadata() # EXIF tags only src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('EXIF_DateTime', 'dt') # not enough values ASCII src_ds.SetMetadataItem('EXIF_DateTimeOriginal', '01234567890123456789') # truncated ASCII src_ds.SetMetadataItem('EXIF_DateTimeDigitized', '0123456789012345678') # right number of items ASCII src_ds.SetMetadataItem('EXIF_Make', 'make') # variable ASCII src_ds.SetMetadataItem('EXIF_ExifVersion', '01234') # truncated UNDEFINED src_ds.SetMetadataItem('EXIF_ComponentsConfiguration', '0x1F') # not enough values UNDEFINED src_ds.SetMetadataItem('EXIF_FlashpixVersion', 'ABCD') # right number of items UNDEFINED src_ds.SetMetadataItem('EXIF_SpatialFrequencyResponse', '0xab 0xCD') # variable UNDEFINED src_ds.SetMetadataItem('EXIF_Orientation', '10') # right number of items SHORT src_ds.SetMetadataItem('EXIF_ResolutionUnit', '2 4') # truncated SHORT src_ds.SetMetadataItem('EXIF_TransferFunction', '0 1') # not enough values SHORT src_ds.SetMetadataItem('EXIF_ISOSpeedRatings', '1 2 3') # variable SHORT src_ds.SetMetadataItem('EXIF_StandardOutputSensitivity', '123456789') # right number of items LONG src_ds.SetMetadataItem('EXIF_XResolution', '96') # right number of items RATIONAL src_ds.SetMetadataItem('EXIF_YResolution', '96 0') # truncated RATIONAL src_ds.SetMetadataItem('EXIF_CompressedBitsPerPixel', 'nan') # invalid RATIONAL src_ds.SetMetadataItem('EXIF_ApertureValue', '-1') # invalid RATIONAL with gdaltest.error_handler(): gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() expected_md = {'EXIF_DateTimeDigitized': '0123456789012345678', 'EXIF_DateTimeOriginal': '0123456789012345678', 'EXIF_Orientation': '10', 'EXIF_ApertureValue': '(0)', 'EXIF_YResolution': '(96)', 'EXIF_XResolution': '(96)', 'EXIF_TransferFunction': '0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0', 'EXIF_ExifVersion': '0123', 'EXIF_DateTime': 'dt ', 'EXIF_FlashpixVersion': 'ABCD', 'EXIF_ComponentsConfiguration': '0x1f 0x00 0x00 0x00', 'EXIF_Make': 'make', 'EXIF_StandardOutputSensitivity': '123456789', 'EXIF_ResolutionUnit': '2', 'EXIF_CompressedBitsPerPixel': '(0)', 'EXIF_SpatialFrequencyResponse': '0xab 0xcd', 'EXIF_ISOSpeedRatings': '1 2 3'} assert got_md == expected_md # Test SRATIONAL for val in (-1.5, -1, -0.5, 0, 0.5, 1, 1.5): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('EXIF_ShutterSpeedValue', str(val)) gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None ds = gdal.Open(tmpfilename) got_val = ds.GetMetadataItem('EXIF_ShutterSpeedValue') got_val = got_val.replace('(', '').replace(')', '') assert float(got_val) == val, ds.GetMetadataItem('EXIF_ShutterSpeedValue') # Test RATIONAL for val in (0, 0.5, 1, 1.5): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('EXIF_ApertureValue', str(val)) gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None ds = gdal.Open(tmpfilename) got_val = ds.GetMetadataItem('EXIF_ApertureValue') got_val = got_val.replace('(', '').replace(')', '') assert float(got_val) == val, ds.GetMetadataItem('EXIF_ApertureValue') # GPS tags only src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('EXIF_GPSLatitudeRef', 'N') src_ds.SetMetadataItem('EXIF_GPSLatitude', '49 34 56.5') gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() assert got_md == {'EXIF_GPSLatitudeRef': 'N', 'EXIF_GPSLatitude': '(49) (34) (56.5)'} ds = None # EXIF and GPS tags src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('EXIF_ExifVersion', '0231') src_ds.SetMetadataItem('EXIF_GPSLatitudeRef', 'N') gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() assert got_md == {'EXIF_ExifVersion': '0231', 'EXIF_GPSLatitudeRef': 'N'} ds = None # EXIF and other metadata src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('EXIF_ExifVersion', '0231') src_ds.SetMetadataItem('EXIF_invalid', 'foo') src_ds.SetMetadataItem('FOO', 'BAR') with gdaltest.error_handler(): gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None assert gdal.VSIStatL(tmpfilename + '.aux.xml') is not None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() assert got_md == {'EXIF_ExifVersion': '0231', 'EXIF_invalid': 'foo', 'FOO': 'BAR'} ds = None # Too much content for EXIF src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('EXIF_UserComment', 'x' * 65535) with gdaltest.error_handler(): gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds) src_ds = None ds = None # EXIF and GPS tags and EXIF overview src_ds = gdal.GetDriverByName('MEM').Create('', 1024, 1024) src_ds.SetMetadataItem('EXIF_ExifVersion', '0231') src_ds.SetMetadataItem('EXIF_GPSLatitudeRef', 'N') gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds, options=['EXIF_THUMBNAIL=YES', 'THUMBNAIL_WIDTH=32', 'THUMBNAIL_HEIGHT=32']) src_ds = None assert gdal.VSIStatL(tmpfilename + '.aux.xml') is None ds = gdal.Open(tmpfilename) got_md = ds.GetMetadata() assert got_md == {'EXIF_ExifVersion': '0231', 'EXIF_GPSLatitudeRef': 'N'} assert ds.GetRasterBand(1).GetOverview(ds.GetRasterBand(1).GetOverviewCount() - 1).XSize == 32 ds = None gdal.Unlink(tmpfilename) ############################################################################### # Test multiscan and overviews def test_jpeg_multiscan_overviews(): tmpfilename = '/vsimem/test_jpeg_multiscan_overviews.jpg' # Will require ~ 20 MB of libjpeg memory src_ds = gdal.GetDriverByName('MEM').Create('', 10000, 1000) src_ds.GetRasterBand(1).Fill(255) ds = gdal.GetDriverByName('JPEG').CreateCopy(tmpfilename, src_ds, options=['PROGRESSIVE=YES']) src_ds = None ds = gdal.Open(tmpfilename) for y in (0,1): assert struct.unpack('B', ds.GetRasterBand(1).ReadRaster(0,y,1,1))[0] == 255 assert struct.unpack('B', ds.GetRasterBand(1).GetOverview(0).ReadRaster(0,y,1,1))[0] == 255 assert struct.unpack('B', ds.GetRasterBand(1).GetOverview(1).ReadRaster(0,y,1,1))[0] == 255 ds = None gdal.Unlink(tmpfilename) ############################################################################### # Cleanup def test_jpeg_cleanup(): gdal.Unlink('tmp/albania.jpg') gdal.Unlink('tmp/albania.jpg.ovr') gdalautotest-3.2.2/gdrivers/aigrid.py0000775000175000017500000001676614020414366016355 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: aigrid.py e19483ef619d39d9de4f946c7b3ce9a091e84e9f 2020-05-10 18:48:13 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for AIGRID driver. # Author: Swapnil Hajare # ############################################################################### # Copyright (c) 2006, Swapnil Hajare # Copyright (c) 2009-2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Read test of simple byte reference data. def test_aigrid_1(): tst = gdaltest.GDALTest('AIG', 'aigrid/abc3x1', 1, 3) return tst.testOpen() ############################################################################### # Verify some auxiliary data. def test_aigrid_2(): ds = gdal.Open('data/aigrid/abc3x1/prj.adf') gt = ds.GetGeoTransform() assert gt[0] == -0.5 and gt[1] == 1.0 and gt[2] == 0.0 and gt[3] == 0.5 and gt[4] == 0.0 and gt[5] == -1.0, \ 'Aigrid geotransform wrong.' prj = ds.GetProjection() assert prj.find('PROJCS["unnamed",GEOGCS["GDA94",DATUM["Geocentric_Datum_of_Australia_1994"') != -1, \ ('Projection does not match expected:\n%s' % prj) band1 = ds.GetRasterBand(1) assert band1.GetNoDataValue() == 255, 'Grid NODATA value wrong or missing.' assert band1.DataType == gdal.GDT_Byte, 'Data type is not Byte!' ############################################################################### # Verify the colormap, and nodata setting for test file. def test_aigrid_3(): ds = gdal.Open('data/aigrid/abc3x1') cm = ds.GetRasterBand(1).GetRasterColorTable() assert cm.GetCount() == 256 and cm.GetColorEntry(0) == (95, 113, 150, 255) and cm.GetColorEntry(1) == (95, 57, 29, 255), \ 'Wrong colormap entries' cm = None assert ds.GetRasterBand(1).GetNoDataValue() == 255.0, 'Wrong nodata value.' ############################################################################### # Read test of simple byte reference data with data directory name in all uppercase def test_aigrid_4(): tst = gdaltest.GDALTest('AIG', 'aigrid/ABC3X1UC', 1, 3) return tst.testOpen() ############################################################################### # Verify the colormap, and nodata setting for test file with names of coverage directory and all files in it in all uppercase. Additionally also test for case where clr file resides in parent directory of coverage. def test_aigrid_5(): ds = gdal.Open('data/aigrid/ABC3X1UC') cm = ds.GetRasterBand(1).GetRasterColorTable() assert cm.GetCount() == 256 and cm.GetColorEntry(0) == (95, 113, 150, 255) and cm.GetColorEntry(1) == (95, 57, 29, 255), \ 'Wrong colormap entries' cm = None assert ds.GetRasterBand(1).GetNoDataValue() == 255.0, 'Wrong nodata value.' ############################################################################### # Verify dataset whose sta.adf is 24 bytes def test_aigrid_6(): ds = gdal.Open('data/aigrid/aigrid_sta_24bytes/teststa') assert ds.GetRasterBand(1).GetMinimum() == 0.0, 'Wrong minimum' assert ds.GetRasterBand(1).GetMaximum() == 2.0, 'Wrong maximum' ############################################################################### # Test on real dataset downloaded from http://download.osgeo.org/gdal/data/aig/nzdem def test_aigrid_online_1(): list_files = ['info/arc.dir', 'info/arc0000.dat', 'info/arc0000.nit', 'info/arc0001.dat', 'info/arc0001.nit', 'info/arc0002.dat', 'info/arc0002.nit', 'info/arc0002r.001', 'nzdem500/dblbnd.adf', 'nzdem500/hdr.adf', 'nzdem500/log', 'nzdem500/sta.adf', 'nzdem500/vat.adf', 'nzdem500/w001001.adf', 'nzdem500/w001001x.adf'] try: os.mkdir('tmp/cache/nzdem') os.mkdir('tmp/cache/nzdem/info') os.mkdir('tmp/cache/nzdem/nzdem500') except OSError: pass for filename in list_files: if not gdaltest.download_file('http://download.osgeo.org/gdal/data/aig/nzdem/' + filename, 'nzdem/' + filename): pytest.skip() tst = gdaltest.GDALTest('AIG', 'tmp/cache/nzdem/nzdem500/hdr.adf', 1, 45334, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/nzdem/nzdem500/hdr.adf') try: rat = ds.GetRasterBand(1).GetDefaultRAT() except: print('Skipping RAT checking... OG Python bindings have no RAT API') return assert rat is not None, 'No RAT found' assert rat.GetRowCount() == 2642, 'Wrong row count in RAT' assert rat.GetColumnCount() == 2, 'Wrong column count in RAT' assert rat.GetNameOfCol(0) == 'VALUE', 'Wrong name of col 0' assert rat.GetTypeOfCol(0) == gdal.GFT_Integer, 'Wrong type of col 0' assert rat.GetUsageOfCol(0) == gdal.GFU_MinMax, 'Wrong usage of col 0' assert rat.GetNameOfCol(1) == 'COUNT', 'Wrong name of col 1' assert rat.GetTypeOfCol(1) == gdal.GFT_Integer, 'Wrong type of col 1' assert rat.GetUsageOfCol(1) == gdal.GFU_PixelCount, 'Wrong usage of col 1' assert rat.GetValueAsInt(2641, 0) == 3627, 'Wrong value in RAT' assert ds.GetRasterBand(1).GetMinimum() == 0.0, 'Wrong minimum' assert ds.GetRasterBand(1).GetMaximum() == 3627.0, 'Wrong maximum' ############################################################################### # Test on real dataset downloaded from http://download.osgeo.org/gdal/data/aig/nzdem def test_aigrid_online_2(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/aig/ai_bug_6886.zip', 'ai_bug_6886.zip'): pytest.skip() try: os.stat('tmp/cache/ai_bug') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/ai_bug_6886') try: os.stat('tmp/cache/ai_bug') except OSError: pytest.skip() except: pytest.skip() tst = gdaltest.GDALTest('AIG', 'tmp/cache/ai_bug/ai_bug/hdr.adf', 1, 16018, filename_absolute=1) return tst.testOpen() ############################################################################### gdalautotest-3.2.2/gdrivers/fits.py0000775000175000017500000010601714020414366016050 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: fits.py 0ce239f27fb438e8f3300e97e004c5a698f58ce6 2020-12-28 23:38:31 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for FITS driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008,2020, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import pytest from osgeo import gdal from osgeo import ogr import gdaltest pytestmark = pytest.mark.require_driver('FITS') @pytest.mark.parametrize( 'filename', ['byte', 'int16', 'uint16', 'int32', 'uint32', 'float32', 'float64'] ) def test_fits(filename): driver = gdal.GetDriverByName('FITS') ds = gdal.Open('../gcore/data/' + filename + '.tif') driver.CreateCopy('tmp/' + filename + '.fits', ds, options=['PAGESIZE=2,2']) ds2 = gdal.Open('tmp/' + filename + '.fits') assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() assert ds2.GetRasterBand(1).DataType == ds.GetRasterBand(1).DataType ds2 = None driver.Delete('tmp/' + filename + '.fits') def test_fits_metadata(): driver = gdal.GetDriverByName('FITS') ds = gdal.Open('../gcore/data/byte.tif') ds2 = driver.CreateCopy('tmp/byte.fits', ds) md = {'TEST': 'test_value'} ds2.SetMetadata(md) ds2 = None gdal.Unlink('tmp/byte.fits.aux.xml') ds2 = gdal.Open('tmp/byte.fits') md = ds2.GetMetadata() ds2 = None assert md['TEST'] == 'test_value' ds2 = gdal.Open('tmp/byte.fits', gdal.GA_Update) md = {'TEST2': 'test_value2'} ds2.SetMetadata(md) ds2 = None gdal.Unlink('tmp/byte.fits.aux.xml') ds2 = gdal.Open('tmp/byte.fits') md = ds2.GetMetadata() ds2 = None assert md['TEST2'] == 'test_value2' def test_fits_nodata(): driver = gdal.GetDriverByName('FITS') ds = gdal.Open('../gcore/data/nodata_byte.tif') ds2 = driver.CreateCopy('tmp/nodata_byte.fits', ds) ds2 = None gdal.Unlink('tmp/nodata_byte.fits.aux.xml') ds2 = gdal.Open('tmp/nodata_byte.fits') nd = ds2.GetRasterBand(1).GetNoDataValue() ds2 = None driver.Delete('tmp/nodata_byte.fits') assert nd == 0 def test_fits_offscale(): driver = gdal.GetDriverByName('FITS') ds = gdal.Open('../gdrivers/data/fits/offscale_byte.tif') ds2 = driver.CreateCopy('tmp/offscale_byte.fits', ds) ds2 = None gdal.Unlink('tmp/offscale_byte.fits.aux.xml') ds2 = gdal.Open('tmp/offscale_byte.fits') offset = ds2.GetRasterBand(1).GetOffset() scale = ds2.GetRasterBand(1).GetScale() ds2 = None driver.Delete('tmp/offscale_byte.fits') assert offset == -0.0039525691699605 assert scale == 1.00395256917 def test_fits_read_offset_scale_no_georef(): ds = gdal.Open('data/fits/offset_scale_no_georef.fits') assert gdal.GetLastErrorMsg() == '' assert ds.GetRasterBand(1).GetOffset() != 0 assert ds.GetRasterBand(1).GetScale() != 1 def test_fits_read_georef_merc(): ds = gdal.Open('data/fits/byte_merc.fits') assert gdal.GetLastErrorMsg() == '' wkt = ds.GetProjectionRef() assert wkt == 'PROJCS["Mercator_Earth",GEOGCS["GCS_Earth",DATUM["D_Earth",SPHEROID["Earth",6378206.4,294.978698213898]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' gt = ds.GetGeoTransform() assert gt == pytest.approx((-13095897.481058259, 72.23522015778646, 0.0, 3991653.2130816197, 0.0, -72.23522015778646), abs=1e-3) def test_fits_read_empty_primary_hdu(): filename = 'data/fits/empty_primary_hdu.fits' assert os.path.exists(filename) with gdaltest.error_handler(): assert gdal.Open(filename) is None def test_fits_read_image_in_second_hdu(): ds = gdal.Open('data/fits/image_in_second_hdu.fits') assert gdal.GetLastErrorMsg() == '' assert ds is not None assert ds.RasterXSize == 1 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 assert ds.GetMetadata() == {'BAR': 'BAZ ', 'FOO': 'BAR_override', 'FOO2': 'BAR2 '} def test_fits_read_image_in_first_and_second_hdu(): ds = gdal.Open('data/fits/image_in_first_and_second_hdu.fits') assert gdal.GetLastErrorMsg() == '' assert ds is not None assert ds.RasterCount == 0 assert ds.GetMetadata() == {'EXTNAME': 'FIRST_IMAGE'} sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 2 assert sub_ds[0][0] == 'FITS:"data/fits/image_in_first_and_second_hdu.fits":1' assert sub_ds[0][1] == 'HDU 1 (1x2, 1 band), FIRST_IMAGE' assert sub_ds[1][0] == 'FITS:"data/fits/image_in_first_and_second_hdu.fits":2' assert sub_ds[1][1] == 'HDU 2 (1x3, 1 band)' with gdaltest.error_handler(): assert gdal.Open('FITS:') is None assert gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits"') is None assert gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":0') is None assert gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":3') is None assert gdal.Open('FITS:"data/fits/non_existing.fits":1') is None ds = gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":1') assert ds.GetSubDatasets() == [] assert ds.RasterXSize == 1 assert ds.RasterYSize == 2 assert ds.GetMetadata() == {'EXTNAME': 'FIRST_IMAGE'} ds = gdal.Open('FITS:"data/fits/image_in_first_and_second_hdu.fits":2') assert ds.GetSubDatasets() == [] assert ds.RasterXSize == 1 assert ds.RasterYSize == 3 assert ds.GetMetadata() == {} def test_fits_read_image_in_second_and_fourth_hdu_table_in_third(): ds = gdal.Open('data/fits/image_in_second_and_fourth_hdu_table_in_third.fits') assert gdal.GetLastErrorMsg() == '' assert ds is not None assert ds.RasterCount == 0 assert ds.GetMetadata() == {'FOO': 'BAR '} sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 2 ds = gdal.Open(sub_ds[0][0]) assert ds.GetSubDatasets() == [] assert ds.RasterXSize == 1 assert ds.RasterYSize == 2 assert ds.GetMetadata() == {'EXTNAME': 'FIRST_IMAGE', 'FOO': 'BAR '} ds = gdal.Open(sub_ds[1][0]) assert ds.GetSubDatasets() == [] assert ds.RasterXSize == 1 assert ds.RasterYSize == 3 assert ds.GetMetadata() == {'EXTNAME': 'SECOND_IMAGE', 'FOO': 'BAR '} # Test opening raster files in vector mode def test_fits_open_raster_only_in_vector_mode(): filename = 'data/fits/empty_primary_hdu.fits' assert os.path.exists(filename) with gdaltest.error_handler(): assert ogr.Open(filename) is None filename = 'data/fits/byte_merc.fits' assert os.path.exists(filename) with gdaltest.error_handler(): assert ogr.Open(filename) is None assert 'but contains image' in gdal.GetLastErrorMsg() filename = 'data/fits/image_in_first_and_second_hdu.fits' assert os.path.exists(filename) with gdaltest.error_handler(): assert ogr.Open(filename) is None ds = gdal.OpenEx('data/fits/image_in_second_and_fourth_hdu_table_in_third.fits', gdal.OF_VECTOR) assert ds.GetMetadata('SUBDATASETS') == {} # Test opening vector files in raster mode def test_fits_open_vector_only_in_raster_mode(): filename = 'data/fits/binary_table.fits' assert os.path.exists(filename) with gdaltest.error_handler(): assert gdal.Open(filename) is None assert 'but contains binary table' in gdal.GetLastErrorMsg() # Test opening with gdal.OF_RASTER | gdal.OF_VECTOR def test_fits_open_mix_mode(): # Raster only content ds = gdal.OpenEx('data/fits/byte_merc.fits', gdal.OF_RASTER | gdal.OF_VECTOR) assert ds.RasterCount != 0 assert ds.GetLayerCount() == 0 # Vector only content ds = gdal.OpenEx('data/fits/binary_table.fits', gdal.OF_RASTER | gdal.OF_VECTOR) assert ds.RasterCount == 0 assert ds.GetLayerCount() != 0 # Mix of raster and vector ds = gdal.OpenEx('data/fits/image_in_second_and_fourth_hdu_table_in_third.fits', gdal.OF_RASTER | gdal.OF_VECTOR) assert ds.GetMetadata('SUBDATASETS') != {} assert ds.GetLayerCount() != 0 def test_fits_vector(): ds = ogr.Open('data/fits/binary_table.fits') assert ds.GetLayerCount() == 1 assert ds.GetLayer(-1) is None assert ds.GetLayer(1) is None lyr = ds.GetLayer(0) assert lyr.GetName() == 'MyTable' assert lyr.GetGeomType() == ogr.wkbNone assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 assert lyr.TestCapability(ogr.OLCRandomRead) == 1 assert lyr.TestCapability("something_else") == 0 assert lyr.GetFeatureCount() == 3 lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 78 mapType = {} for x in ["ogr.OFTInteger", "ogr.OFTInteger64", "ogr.OFTReal", "ogr.OFTString", "ogr.OFTIntegerList", "ogr.OFTInteger64List", "ogr.OFTRealList", "ogr.OFTStringList"]: mapType[eval(x)] = x mapSubType = {} for x in ["ogr.OFSTNone", "ogr.OFSTBoolean", "ogr.OFSTFloat32", "ogr.OFSTInt16"]: mapSubType[eval(x)] = x got = [(lyr_defn.GetFieldDefn(i).GetNameRef(), mapType[lyr_defn.GetFieldDefn(i).GetType()], mapSubType[lyr_defn.GetFieldDefn(i).GetSubType()], lyr_defn.GetFieldDefn(i).GetWidth()) for i in range(lyr_defn.GetFieldCount())] expected = [('B_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('B_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('I_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('I_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('J_scaled_integer', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), ('J_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('K_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('E_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('D_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('C_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('M_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('L', 'ogr.OFTInteger', 'ogr.OFSTBoolean', 0), ('2L', 'ogr.OFTIntegerList', 'ogr.OFSTBoolean', 0), ('PL', 'ogr.OFTIntegerList', 'ogr.OFSTBoolean', 0), ('QL', 'ogr.OFTIntegerList', 'ogr.OFSTBoolean', 0), ('X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit2', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit3', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit4', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit5', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit6', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit7', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit8', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit9', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit10', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit11', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit12', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit13', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit14', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit15', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit16', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit17', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit18', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit19', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit20', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit21', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit22', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit23', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit24', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit25', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit26', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit27', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit28', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit29', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit30', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit31', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit32', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit33', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('B', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('2B', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('PB', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('BDIM', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('I', 'ogr.OFTInteger', 'ogr.OFSTInt16', 0), ('2I', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), ('PI', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), ('J', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('2J', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('PJ', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('K', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), ('2K', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), ('PK', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), ('A', 'ogr.OFTString', 'ogr.OFSTNone', 1), ('A2', 'ogr.OFTString', 'ogr.OFSTNone', 2), ('PA', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('ADIM', 'ogr.OFTStringList', 'ogr.OFSTNone', 2), ('E', 'ogr.OFTReal', 'ogr.OFSTFloat32', 0), ('2E', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), ('PE', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), ('D', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('2D', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), ('PD', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), ('C', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('2C', 'ogr.OFTStringList', 'ogr.OFSTNone', 0), ('PC', 'ogr.OFTStringList', 'ogr.OFSTNone', 0), ('M', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('2M', 'ogr.OFTStringList', 'ogr.OFSTNone', 0), ('PM', 'ogr.OFTStringList', 'ogr.OFSTNone', 0)] if got != expected: import pprint pp = pprint.PrettyPrinter() pp.pprint(got) assert False assert lyr.GetFeature(0) is None assert lyr.GetFeature(4) is None expected_f1 = [ -128, 5.5, 0, -49149.5, 0, -3221225469.5, -1.3835058055282164e+19, 4.375, 4.375, '4.375 + 5.875j', '4.375 + 5.875j', 0, [0, 0], [1, 0], [1, 0], 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, [255, 0], [255, 0], [0, 255, 0, 255, 0, 255], -32768, [-32768, 32767], [-32768, 32767], -2147483648, [-2147483648, 2147483647], [-2147483648, 2147483647], -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], 'A', 'AB', 'AB', ['AB', 'ab', 'Ab'], 1.25, [1.25, 2.25], [1.25, 2.25], 1.2534, [1.2534, 2.25], [1.2534, 2.25], '1.25 + 2.25j', ['1.25 + 2.25j', '2.25 + 1.25j'], ['1.25 + 2.25j', '2.25 + 1.25j'], '1.25340000000000007 + 2.25j', ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], ['1.25340000000000007 + 2.25j', '2.25 + 1.25j']] f = lyr.GetNextFeature() got = [f.GetField(i) for i in range(f.GetFieldCount())] assert got == expected_f1 f = lyr.GetFeature(1) got = [f.GetField(i) for i in range(f.GetFieldCount())] assert got == expected_f1 expected_f2 = [ 127, 385.0, 65535, 49153.0, 4294967295, 3221225473.0, 1.3835058055282164e+19, 5.875, 5.875, '2.5 + 2.5j', '2.5 + 2.5j', 0, [0, 0], [0, 1, 0], [0, 1, 0], 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 255, [0, 255], [0, 255, 0], [255, 255, 0, 0, 0, 255], 32767, [32767, -32768], [32767, 0, -32768], 2147483647, [2147483647, -2147483648], [2147483647, 0, -2147483648], 9223372036854775807, [9223372036854775807, -9223372036854775808], [9223372036854775807, 0, -9223372036854775808], 'B', 'CD', 'CDE', ['CD', 'cd', 'Cd'], 2.25, [2.25, 1.25], [2.25, 1.25, 2.25], 2.25, [2.2534, 1.25], [2.2534, 1.25, 2.25], '2.25 + 1.25j', ['2.25 + 1.25j', '1.25 + 2.25j'], ['2.25 + 1.25j', '1.25 + 2.25j', '2.25 + 1.25j'], '2.25 + 1.25j', ['2.25 + 1.25j', '1.25 + 2.25j'], ['2.25 + 1.25j', '1.25 + 2.25j', '2.25 + 1.25j']] f = lyr.GetNextFeature() got = [f.GetField(i) for i in range(f.GetFieldCount())] assert got == expected_f2 f = lyr.GetNextFeature() assert f.GetField('B') is None def _check_lyr_defn_after_write(lyr_defn): assert lyr_defn.GetFieldCount() == 73 mapType = {} for x in ["ogr.OFTInteger", "ogr.OFTInteger64", "ogr.OFTReal", "ogr.OFTString", "ogr.OFTIntegerList", "ogr.OFTInteger64List", "ogr.OFTRealList", "ogr.OFTStringList"]: mapType[eval(x)] = x mapSubType = {} for x in ["ogr.OFSTNone", "ogr.OFSTBoolean", "ogr.OFSTFloat32", "ogr.OFSTInt16"]: mapSubType[eval(x)] = x got = [(lyr_defn.GetFieldDefn(i).GetNameRef(), mapType[lyr_defn.GetFieldDefn(i).GetType()], mapSubType[lyr_defn.GetFieldDefn(i).GetSubType()], lyr_defn.GetFieldDefn(i).GetWidth()) for i in range(lyr_defn.GetFieldCount())] expected = [('B_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('B_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('I_scaled_integer', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('I_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('J_scaled_integer', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), ('J_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('K_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('E_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('D_scaled', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('C_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('M_scaled', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('L', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('2L', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('PL', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('QL', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit1', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit2', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit3', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit4', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit5', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit6', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit7', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit8', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit9', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit10', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit11', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit12', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit13', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit14', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit15', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit16', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit17', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit18', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit19', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit20', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit21', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit22', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit23', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit24', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit25', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit26', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit27', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit28', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit29', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit30', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit31', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit32', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('33X_bit33', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('B', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('2B', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('PB', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('BDIM', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('I', 'ogr.OFTInteger', 'ogr.OFSTInt16', 0), ('2I', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), ('PI', 'ogr.OFTIntegerList', 'ogr.OFSTInt16', 0), ('J', 'ogr.OFTInteger', 'ogr.OFSTNone', 0), ('2J', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('PJ', 'ogr.OFTIntegerList', 'ogr.OFSTNone', 0), ('K', 'ogr.OFTInteger64', 'ogr.OFSTNone', 0), ('2K', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), ('PK', 'ogr.OFTInteger64List', 'ogr.OFSTNone', 0), ('A', 'ogr.OFTString', 'ogr.OFSTNone', 1), ('A2', 'ogr.OFTString', 'ogr.OFSTNone', 2), ('PA', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('E', 'ogr.OFTReal', 'ogr.OFSTFloat32', 0), ('2E', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), ('PE', 'ogr.OFTRealList', 'ogr.OFSTFloat32', 0), ('D', 'ogr.OFTReal', 'ogr.OFSTNone', 0), ('2D', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), ('PD', 'ogr.OFTRealList', 'ogr.OFSTNone', 0), ('C', 'ogr.OFTString', 'ogr.OFSTNone', 0), ('M', 'ogr.OFTString', 'ogr.OFSTNone', 0)] if got != expected: import pprint pp = pprint.PrettyPrinter() pp.pprint(got) assert False def test_fits_vector_write_with_source_fits_metadata(): filename = 'tmp/out.fits' with gdaltest.error_handler(): gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS') try: ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3 lyr_defn = lyr.GetLayerDefn() _check_lyr_defn_after_write(lyr_defn) md = lyr.GetMetadata() assert md['TFORM13'].rstrip() == '2J' assert md['TFORM16'].rstrip() == '1X' assert md['TFORM17'].rstrip() == '33X' assert md['TFORM23'].rstrip() == '2I' assert md['TFORM29'].rstrip() == '2K' assert md['TFORM32'].rstrip() == '2A' assert md['TFORM35'].rstrip() == '2E' assert md['TFORM38'].rstrip() == '2D' assert md['TFORM40'].rstrip() == 'C' assert md['TFORM41'].rstrip() == 'M' expected_f1 = [ -128, 5.5, 0, -49149.5, 0, -3221225469.5, -1.3835058055282164e+19, 4.375, 4.375, '4.375 + 5.875j', '4.375 + 5.875j', 0, [0, 0], [1, 0], [1, 0], 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, [255, 0], [255, 0], [0, 255, 0, 255, 0, 255], -32768, [-32768, 32767], [-32768, 32767], -2147483648, [-2147483648, 2147483647], [-2147483648, 2147483647], -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], 'A', 'AB', 'AB', # ['AB', 'ab', 'Ab'], 1.25, [1.25, 2.25], [1.25, 2.25], 1.2534, [1.2534, 2.25], [1.2534, 2.25], '1.25 + 2.25j', # ['1.25 + 2.25j', '2.25 + 1.25j'], # ['1.25 + 2.25j', '2.25 + 1.25j'], '1.25340000000000007 + 2.25j', # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'] ] f = lyr.GetNextFeature() got = [f.GetField(i) for i in range(f.GetFieldCount())] assert got == expected_f1 except: ds = None os.unlink(filename) raise def test_fits_vector_write_without_source_fits_metadata(): filename = 'tmp/out.fits' with gdaltest.error_handler(): gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS -nomd') try: ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3 lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 73 _check_lyr_defn_after_write(lyr_defn) md = lyr.GetMetadata() assert md['TFORM13'].rstrip() == 'PJ(2)' assert md['TFORM16'].rstrip() == '1X' assert md['TFORM17'].rstrip() == '33X' assert md['TFORM23'].rstrip() == 'PI(2)' assert md['TFORM29'].rstrip() == 'PK(2)' assert md['TFORM32'].rstrip() == '2A' # from field width assert md['TFORM35'].rstrip() == 'PE(2)' assert md['TFORM38'].rstrip() == 'PD(2)' assert md['TFORM40'].rstrip().startswith('PA(') # not recognized as complex assert md['TFORM41'].rstrip().startswith('PA(') # not recognized as complex expected_f1 = [ -128, 5.5, 0, -49149.5, 0, -3221225469.5, -1.3835058055282164e+19, 4.375, 4.375, '4.375 + 5.875j', '4.375 + 5.875j', 0, [0, 0], [1, 0], [1, 0], 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, [255, 0], [255, 0], [0, 255, 0, 255, 0, 255], -32768, [-32768, 32767], [-32768, 32767], -2147483648, [-2147483648, 2147483647], [-2147483648, 2147483647], -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], 'A', 'AB', 'AB', # ['AB', 'ab', 'Ab'], 1.25, [1.25, 2.25], [1.25, 2.25], 1.2534, [1.2534, 2.25], [1.2534, 2.25], '1.25 + 2.25j', # ['1.25 + 2.25j', '2.25 + 1.25j'], # ['1.25 + 2.25j', '2.25 + 1.25j'], '1.25340000000000007 + 2.25j', # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'] ] f = lyr.GetNextFeature() got = [f.GetField(i) for i in range(f.GetFieldCount())] assert got == expected_f1 except: ds = None os.unlink(filename) raise def test_fits_vector_write_without_source_fits_metadata_compute_repeat(): filename = 'tmp/out.fits' with gdaltest.error_handler(): gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS -nomd -lco COMPUTE_REPEAT=AT_FIRST_FEATURE_CREATION -lco REPEAT_2E=3') try: ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3 lyr_defn = lyr.GetLayerDefn() _check_lyr_defn_after_write(lyr_defn) md = lyr.GetMetadata() assert md['TFORM13'].rstrip() == '2J' assert md['TFORM16'].rstrip() == '1X' assert md['TFORM17'].rstrip() == '33X' assert md['TFORM23'].rstrip() == '2I' assert md['TFORM29'].rstrip() == '2K' assert md['TFORM32'].rstrip() == '2A' # from field width assert md['TFORM35'].rstrip() == '3E' # should normally be 2E, but overridden by REPEAT_2E=3 assert md['TFORM38'].rstrip() == '2D' assert md['TFORM40'].rstrip().startswith('PA(') # not recognized as complex assert md['TFORM41'].rstrip().startswith('PA(') # not recognized as complex expected_f1 = [ -128, 5.5, 0, -49149.5, 0, -3221225469.5, -1.3835058055282164e+19, 4.375, 4.375, '4.375 + 5.875j', '4.375 + 5.875j', 0, [0, 0], [1, 0], [1, 0], 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, [255, 0], [255, 0], [0, 255, 0, 255, 0, 255], -32768, [-32768, 32767], [-32768, 32767], -2147483648, [-2147483648, 2147483647], [-2147483648, 2147483647], -9223372036854775808, [-9223372036854775808, 9223372036854775807], [-9223372036854775808, 9223372036854775807], 'A', 'AB', 'AB', # ['AB', 'ab', 'Ab'], 1.25, [1.25, 2.25, 0], [1.25, 2.25], 1.2534, [1.2534, 2.25], [1.2534, 2.25], '1.25 + 2.25j', # ['1.25 + 2.25j', '2.25 + 1.25j'], # ['1.25 + 2.25j', '2.25 + 1.25j'], '1.25340000000000007 + 2.25j', # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'], # ['1.25340000000000007 + 2.25j', '2.25 + 1.25j'] ] f = lyr.GetNextFeature() got = [f.GetField(i) for i in range(f.GetFieldCount())] assert got == expected_f1 except: ds = None os.unlink(filename) raise def test_fits_vector_editing(): filename = 'tmp/out.fits' with gdaltest.error_handler(): gdal.VectorTranslate(filename, 'data/fits/binary_table.fits', options='-f FITS -nomd') try: ds = ogr.Open(filename, update = 1) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3 f = lyr.GetNextFeature() f['A2'] = 'XY' assert lyr.SetFeature(f) == ogr.OGRERR_NONE f = lyr.GetFeature(1) assert f['A2'] == 'XY' f = None assert lyr.CreateField(ogr.FieldDefn('new_field', ogr.OFTReal)) == ogr.OGRERR_NONE f = lyr.GetFeature(1) f.SetFID(-1) f['new_field'] = 1.25 assert lyr.CreateFeature(f) == ogr.OGRERR_NONE assert lyr.GetFeatureCount() == 4 assert f.GetFID() == 4 f = lyr.GetFeature(4) assert f['A2'] == 'XY' assert f['new_field'] == 1.25 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(0) assert lyr.SetFeature(f) == ogr.OGRERR_NON_EXISTING_FEATURE f.SetFID(5) assert lyr.SetFeature(f) == ogr.OGRERR_NON_EXISTING_FEATURE assert lyr.DeleteFeature(0) == ogr.OGRERR_NON_EXISTING_FEATURE assert lyr.DeleteFeature(5) == ogr.OGRERR_NON_EXISTING_FEATURE assert lyr.DeleteFeature(1) == ogr.OGRERR_NONE assert lyr.GetFeatureCount() == 3 except: ds = None os.unlink(filename) raise gdalautotest-3.2.2/gdrivers/idrisi.py0000775000175000017500000000606614020414366016371 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: idrisi.py 57043625302ca84f21a526cb9029436d58d1081e 2020-05-10 17:20:36 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for RST/Idrisi driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2006, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import gdaltest ############################################################################### # Read test of byte file. def test_idrisi_1(): tst = gdaltest.GDALTest('RST', 'rst/byte.rst', 1, 5044) return tst.testOpen() ############################################################################### # Read test of byte file. def test_idrisi_2(): tst = gdaltest.GDALTest('RST', 'rst/real.rst', 1, 5275) return tst.testOpen() ############################################################################### # def test_idrisi_3(): tst = gdaltest.GDALTest('RST', 'ehdr/float32.bil', 1, 27) return tst.testCreate(new_filename='tmp/float32.rst', out_bands=1, vsimem=1) ############################################################################### # def test_idrisi_4(): tst = gdaltest.GDALTest('RST', 'rgbsmall.tif', 2, 21053) return tst.testCreateCopy(check_gt=1, check_srs=1, new_filename='tmp/rgbsmall_cc.rst', vsimem=1) ############################################################################### # Cleanup. def test_idrisi_cleanup(): gdaltest.clean_tmp() try: os.unlink('data/rgbsmall.tif.aux.xml') os.unlink('data/rst/real.rst.aux.xml') os.unlink('data/frmt09.cot.aux.xml') os.unlink('data/rst/byte.rst.aux.xml') print('FIXME?: data/rgbsmall.tif.aux.xml is produced by those tests') except OSError: pass gdalautotest-3.2.2/gdrivers/wms.py0000775000175000017500000007156614020414366015723 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: wms.py 64ff6d13a3b3eef2e46bab37536094fb6d8a64c4 2020-05-10 17:25:53 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test WMS client support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2007-2014, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil from time import sleep import hashlib from osgeo import gdal import gdaltest import pytest ############################################################################### # Verify we have the driver. def test_wms_1(): gdaltest.wms_drv = gdal.GetDriverByName('WMS') if gdaltest.wms_drv is None: pytest.skip() ############################################################################### # Open the WMS dataset def wms_2(): if gdaltest.wms_drv is None: pytest.skip() # NOTE - mloskot: # This is a dirty hack checking if remote WMS service is online. # Nothing genuine but helps to keep the buildbot waterfall green. srv = 'http://sedac.ciesin.columbia.edu/mapserver/map/GPWv3?' gdaltest.wms_srv1_ok = gdaltest.gdalurlopen(srv) is not None gdaltest.wms_ds = None if not gdaltest.wms_srv1_ok: pytest.skip() gdaltest.wms_ds = gdal.Open('data/wms/pop_wms.xml') if gdaltest.wms_ds is not None: return pytest.fail('open failed.') ############################################################################### # Check various things about the configuration. def wms_3(): if gdaltest.wms_drv is None or gdaltest.wms_ds is None: pytest.skip() if not gdaltest.wms_srv1_ok: pytest.skip() assert gdaltest.wms_ds.RasterXSize == 36000 and gdaltest.wms_ds.RasterYSize == 14500 and gdaltest.wms_ds.RasterCount == 3, \ 'wrong size or bands' wkt = gdaltest.wms_ds.GetProjectionRef() assert wkt[:14] == 'GEOGCS["WGS 84', ('Got wrong SRS: ' + wkt) gt = gdaltest.wms_ds.GetGeoTransform() assert gt[0] == pytest.approx(-180, abs=0.00001) and gt[3] == pytest.approx(85, abs=0.00001) and gt[1] == pytest.approx(0.01, abs=0.00001) and gt[2] == pytest.approx(0, abs=0.00001) and gt[5] == pytest.approx(-0.01, abs=0.00001) and gt[4] == pytest.approx(0, abs=0.00001), \ 'wrong geotransform' assert gdaltest.wms_ds.GetRasterBand(1).GetOverviewCount() >= 1, 'no overviews!' assert gdaltest.wms_ds.GetRasterBand(1).DataType >= gdal.GDT_Byte, \ 'wrong band data type' ############################################################################### # Check checksum for a small region. def wms_4(): if gdaltest.wms_drv is None or gdaltest.wms_ds is None: pytest.skip() if not gdaltest.wms_srv1_ok: pytest.skip() gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'ON') gdal.PushErrorHandler('CPLQuietErrorHandler') cs = gdaltest.wms_ds.GetRasterBand(1).Checksum(0, 0, 100, 100) gdal.PopErrorHandler() gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'OFF') msg = gdal.GetLastErrorMsg() gdal.ErrorReset() if msg is not None and msg.find('Service denied due to system overload') != -1: pytest.skip(msg) assert cs == 57182, ('Wrong checksum: ' + str(cs)) ############################################################################### # Open the WMS service using XML as filename. def test_wms_5(): if gdaltest.wms_drv is None: pytest.skip() # We don't need to check if the remote service is online as we # don't need a connection for this test fn = '1.1.1http://onearth.jpl.nasa.gov/wms.cgi?EPSG:4326image/jpegmodis,global_mosaic-180.090.0180.0-90.026666661333333EPSG:43263' ds = gdal.Open(fn) assert ds is not None, 'open failed.' assert ds.RasterXSize == 2666666 and ds.RasterYSize == 1333333 and ds.RasterCount == 3, \ 'wrong size or bands' ds = None ############################################################################### # Test TileService def test_wms_6(): if gdaltest.wms_drv is None: pytest.skip() # We don't need to check if the remote service is online as we # don't need a connection for this test fn = '1http://s0.tileservice.worldwindcentral.com/getTile?za.johannesburg_2006_20cm-180.090.0180.0-90.026843545613421772819EPSG:4326165125123' ds = gdal.Open(fn) assert ds is not None, 'open failed.' assert ds.RasterXSize == 268435456 and ds.RasterYSize == 134217728 and ds.RasterCount == 3, \ 'wrong size or bands' ds = None ############################################################################### # Test TMS def test_wms_7(): if gdaltest.wms_drv is None: pytest.skip() srv = 'http://tilecache.osgeo.org/wms-c/Basic.py' gdaltest.metacarta_tms = False if gdaltest.gdalurlopen(srv) is None: pytest.skip() gdaltest.metacarta_tms = True tms = """ http://tilecache.osgeo.org/wms-c/Basic.py basic png -180.0 90.0 180.0 -90.0 19 2 1 EPSG:4326 256 256 3 """ ds = gdal.Open(tms) assert ds is not None, 'open failed.' assert ds.RasterXSize == 268435456 and ds.RasterYSize == 134217728 and ds.RasterCount == 3, \ 'wrong size or bands' assert ds.GetRasterBand(1).GetOverview(18).XSize == 512 and ds.GetRasterBand(1).GetOverview(18).YSize == 256 ds.GetRasterBand(1).GetOverview(18).ReadRaster(0, 0, 512, 256) ds = None ############################################################################### # Test TMS with cache def test_wms_8(): if gdaltest.wms_drv is None: pytest.skip() # server_url = 'http://tilecache.osgeo.org/wms-c/Basic.py' # wmstms_version = '/1.0.0/basic' # zero_tile = wmstms_version + '/0/0/0.png' # server_url_mask = server_url # ovr_upper_level = 18 # tms = """ # # %s # basic # png # # # -180.0 # 90.0 # 180.0 # -90.0 # 19 # 2 # 1 # # EPSG:4326 # 256 # 256 # 3 # ./tmp/gdalwmscache # """ % server_url_mask # tms_nocache = """ # # %s # basic # png # # # -180.0 # 90.0 # 180.0 # -90.0 # 19 # 2 # 1 # # EPSG:4326 # 256 # 256 # 3 # # """ % server_url_mask server_url = 'http://tile.openstreetmap.org' wmstms_version = '' zero_tile = '/0/0/0.png' server_url_mask = server_url + '/${z}/${x}/${y}.png' ovr_upper_level = 16 tms = """ %s -20037508.34 20037508.34 20037508.34 -20037508.34 18 1 1 top EPSG:3857 256 256 3 ./tmp/gdalwmscache """ % server_url_mask tms_nocache = """ %s -20037508.34 20037508.34 20037508.34 -20037508.34 18 1 1 top EPSG:3857 256 256 3 """ % server_url_mask if gdaltest.gdalurlopen(server_url) is None: pytest.skip() try: shutil.rmtree('tmp/gdalwmscache') except OSError: pass ds = gdal.Open(tms) assert ds is not None, 'open failed.' # Check cache metadata item cache_path = ds.GetMetadataItem("CACHE_PATH") assert cache_path, 'did not get expected cache path metadata item' cache_subfolder = hashlib.md5(server_url_mask.encode('utf-8')).hexdigest() gdal.ErrorReset() data = ds.GetRasterBand(1).GetOverview(ovr_upper_level).ReadRaster(0, 0, 512, 512) if gdal.GetLastErrorMsg() != '': if gdaltest.gdalurlopen(server_url + zero_tile) is None: pytest.skip() ds = None file1 = hashlib.md5((server_url + wmstms_version + '/1/0/0.png').encode('utf-8')).hexdigest() file2 = hashlib.md5((server_url + wmstms_version + '/1/1/0.png').encode('utf-8')).hexdigest() file3 = hashlib.md5((server_url + wmstms_version + '/1/0/1.png').encode('utf-8')).hexdigest() file4 = hashlib.md5((server_url + wmstms_version + '/1/1/1.png').encode('utf-8')).hexdigest() expected_files = ['tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file1[0], file1[1], file1), 'tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file2[0], file2[1], file2), 'tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file3[0], file3[1], file3), 'tmp/gdalwmscache/%s/%s/%s/%s' % (cache_subfolder, file4[0], file4[1], file4)] for expected_file in expected_files: try: os.stat(expected_file) except OSError: pytest.fail('%s should exist' % expected_file) # Now, we should read from the cache ds = gdal.Open(tms) cached_data = ds.GetRasterBand(1).GetOverview(ovr_upper_level).ReadRaster(0, 0, 512, 512) ds = None assert data == cached_data, 'data != cached_data' # Replace the cache with fake data for expected_file in expected_files: ds = gdal.GetDriverByName('GTiff').Create(expected_file, 256, 256, 4) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(255) ds = None # Read again from the cache, and check that it is actually used ds = gdal.Open(tms) cs = ds.GetRasterBand(1).GetOverview(ovr_upper_level).Checksum() ds = None assert cs == 0, 'cs != 0' # Test with GDAL_DEFAULT_WMS_CACHE_PATH # Now, we should read from the cache gdal.SetConfigOption("GDAL_DEFAULT_WMS_CACHE_PATH", "./tmp/gdalwmscache") ds = gdal.Open(tms_nocache) cs = ds.GetRasterBand(1).GetOverview(ovr_upper_level).Checksum() ds = None gdal.SetConfigOption("GDAL_DEFAULT_WMS_CACHE_PATH", None) assert cs == 0, 'cs != 0' # Check maxsize and expired tags tms_expires = """ %s -20037508.34 20037508.34 20037508.34 -20037508.34 18 1 1 top EPSG:3857 256 256 3 ./tmp/gdalwmscache1 """ % server_url_mask mod_time = 0 for expected_file in expected_files: tm = os.path.getmtime(expected_file) if tm > mod_time: mod_time = tm ds = gdal.Open(tms_expires) sleep(1.05) data = ds.GetRasterBand(1).GetOverview(ovr_upper_level).ReadRaster(0, 0, 512, 512) # tiles should be overwritten by new ones for expected_file in expected_files: assert os.path.getmtime(expected_file) > mod_time ############################################################################### # Test OnEarth Tiled WMS minidriver def wms_9(): if gdaltest.wms_drv is None: pytest.skip() tms = """ http://onearth.jpl.nasa.gov/wms.cgi? Global SRTM Elevation """ ds = gdal.Open(tms) if ds is None: srv = 'http://onearth.jpl.nasa.gov/wms.cgi?' if gdaltest.gdalurlopen(srv) is None: pytest.skip() pytest.fail('open failed.') expected_cs = 5478 cs = ds.GetRasterBand(1).GetOverview(9).Checksum() assert cs == expected_cs, 'Did not get expected SRTM checksum.' ds = None ############################################################################### # Test getting subdatasets from GetCapabilities def wms_10(): if gdaltest.wms_drv is None: pytest.skip() if not gdaltest.wms_srv1_ok: pytest.skip() name = "WMS:http://sedac.ciesin.columbia.edu/mapserver/map/GPWv3?" ds = gdal.Open(name) assert ds is not None, ('open of %s failed.' % name) subdatasets = ds.GetMetadata("SUBDATASETS") assert subdatasets, 'did not get expected subdataset count' ds = None name = subdatasets['SUBDATASET_1_NAME'] ds = gdal.Open(name) assert ds is not None, ('open of %s failed.' % name) ds = None ############################################################################### # Test getting subdatasets from GetTileService def test_wms_11(): if gdaltest.wms_drv is None: pytest.skip() if gdaltest.skip_on_travis(): pytest.skip() srv = 'http://onearth.jpl.nasa.gov/wms.cgi' if gdaltest.gdalurlopen(srv) is None: pytest.skip() name = "WMS:http://onearth.jpl.nasa.gov/wms.cgi?request=GetTileService" ds = gdal.Open(name) assert ds is not None, ('open of %s failed.' % name) subdatasets = ds.GetMetadata("SUBDATASETS") assert subdatasets, 'did not get expected subdataset count' ds = None name = subdatasets['SUBDATASET_1_NAME'] ds = gdal.Open(name) assert ds is not None, ('open of %s failed.' % name) ds = None ############################################################################### # Test getting subdatasets from a TMS server def test_wms_12(): if gdaltest.wms_drv is None: pytest.skip() if gdaltest.metacarta_tms is not True: pytest.skip() name = "http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/" ds = gdal.Open(name) if ds is None: if gdaltest.gdalurlopen('http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/basic/0/0/0.png') is None: pytest.skip() pytest.fail('open of %s failed.' % name) subdatasets = ds.GetMetadata("SUBDATASETS") assert subdatasets, 'did not get expected subdataset count' ds = None for i in range(len(subdatasets) // 2): desc = subdatasets['SUBDATASET_%d_DESC' % (i + 1)] if desc == 'basic': name = subdatasets['SUBDATASET_%d_NAME' % (i + 1)] ds = gdal.Open(name) if ds is None: if gdaltest.gdalurlopen('http://tilecache.osgeo.org/wms-c/Basic.py/1.0.0/basic/0/0/0.png') is None: pytest.skip() pytest.fail('open of %s failed.' % name) ds = None ############################################################################### # Test reading WMS through VRT (test effect of r21866) def test_wms_13(): if gdaltest.wms_drv is None: pytest.skip() ds = gdal.Open("data/wms/DNEC_250K.vrt") if ds.ReadRaster(0, 0, 1024, 682) is None: srv = 'http://wms.geobase.ca/wms-bin/cubeserv.cgi?SERVICE=WMS&VERSION=1.1.1&REQUEST=GeCapabilities' if gdaltest.gdalurlopen(srv) is None: pytest.skip() pytest.fail() ds = None ############################################################################### # Test reading Virtual Earth layer def test_wms_14(): if gdaltest.wms_drv is None: pytest.skip() ds = gdal.Open(""" http://a${server_num}.ortho.tiles.virtualearth.net/tiles/a${quadkey}.jpeg?g=90 """) if ds is None: return' fail' assert ds.RasterXSize == 134217728 and ds.RasterYSize == 134217728 and ds.RasterCount == 3, \ 'wrong size or bands' wkt = ds.GetProjectionRef() assert 'EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"]' in wkt, \ ('Got wrong SRS: ' + wkt) gt = ds.GetGeoTransform() assert abs(gt[0] - -20037508.34278924,) <= 0.00001 and abs(gt[3] - 20037508.34278924,) <= 0.00001 and gt[1] == pytest.approx(0.2985821417389697, abs=0.00001) and gt[2] == pytest.approx(0, abs=0.00001) and abs(gt[5] - -0.2985821417389697,) <= 0.00001 and gt[4] == pytest.approx(0, abs=0.00001), \ 'wrong geotransform' assert ds.GetRasterBand(1).GetOverviewCount() == 18, 'bad overview count' (block_xsize, block_ysize) = ds.GetRasterBand(1).GetBlockSize() if block_xsize != 256 or block_ysize != 256: print("(%d, %d)" % (block_xsize, block_ysize)) pytest.fail('bad block size') ############################################################################### # Test reading ArcGIS MapServer JSon definition and CreateCopy() def test_wms_15(): if gdaltest.wms_drv is None: pytest.skip() src_ds = gdal.Open("http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer?f=json&pretty=true") if src_ds is None: srv = 'http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer?f=json&pretty=true' if gdaltest.gdalurlopen(srv) is None: pytest.skip() pytest.fail() ds = gdal.GetDriverByName("WMS").CreateCopy("/vsimem/wms.xml", src_ds) src_ds = None if ds is None: return' fail' assert ds.RasterXSize == 1073741824 and ds.RasterYSize == 1073741824 and ds.RasterCount == 3, \ 'wrong size or bands' wkt = ds.GetProjectionRef() assert wkt.startswith('PROJCS["WGS 84 / Pseudo-Mercator"'), ('Got wrong SRS: ' + wkt) gt = ds.GetGeoTransform() assert gt[0] == pytest.approx(-20037508.342787001, abs=0.00001) and gt[3] == pytest.approx(20037508.342787001, abs=0.00001) and gt[1] == pytest.approx(0.037322767717361482, abs=0.00001) and gt[2] == pytest.approx(0, abs=0.00001) and gt[5] == pytest.approx(-0.037322767717361482, abs=0.00001) and gt[4] == pytest.approx(0, abs=0.00001), \ 'wrong geotransform' assert ds.GetRasterBand(1).GetOverviewCount() == 22, 'bad overview count' (block_xsize, block_ysize) = ds.GetRasterBand(1).GetBlockSize() if block_xsize != 256 or block_ysize != 256: print("(%d, %d)" % (block_xsize, block_ysize)) pytest.fail('bad block size') ds = None gdal.Unlink("/vsimem/wms.xml") ############################################################################### # Test getting subdatasets from WMS-C Capabilities def test_wms_16(): if gdaltest.wms_drv is None: pytest.skip() if not gdaltest.run_slow_tests(): # server often returns a 504 after ages; this test can take minutes pytest.skip() name = "WMS:http://demo.opengeo.org/geoserver/gwc/service/wms?tiled=TRUE" ds = gdal.Open(name) if ds is None: srv = 'http://demo.opengeo.org/geoserver/gwc/service/wms?' if gdaltest.gdalurlopen(srv) is None: pytest.skip() pytest.fail('open of %s failed.' % name) subdatasets = ds.GetMetadata("SUBDATASETS") assert subdatasets, 'did not get expected subdataset count' ds = None name = None for key in subdatasets: if key[-5:] == '_NAME' and subdatasets[key].find('bugsites') != -1: name = subdatasets[key] break assert name is not None name = 'http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&request=GetMap&version=1.1.1&layers=og:bugsites&styles=&srs=EPSG:26713&bbox=599351.50000000,4914096.00000000,608471.00000000,4920512.00000000' ds = gdal.Open(name) assert ds is not None, ('open of %s failed.' % name) # Matches feature of "WFS:http://demo.opengeo.org/geoserver/wfs?SRSNAME=EPSG:900913" og:bugsites # OGRFeature(og:bugsites):68846 # gml_id (String) = bugsites.68846 # cat (Integer) = 86 # str1 (String) = Beetle site # POINT (-11547069.564865021035075 5528605.849725087173283) pixel = "GeoPixel_601228_4917635" val = ds.GetRasterBand(1).GetMetadataItem(pixel, "LocationInfo") # Some bug in GeoServer ? if val is not None and 'java.lang.NoSuchMethodError: org.geoserver.wms.WMS.pixelToWorld' in val: pytest.skip(val) if val is not None and ('Gateway Time-out' in val or 'HTTP error code : 5' in val): pytest.skip() if val is None or val.find('86') == -1: if 'java.lang.NullPointerException' in val or '504 Gateway Time-out' in val or 'java.lang.OutOfMemoryError' in val: pytest.skip(val) print(val) pytest.fail('expected a value') # Ask again. Should be cached val_again = ds.GetRasterBand(1).GetMetadataItem(pixel, "LocationInfo") assert val_again == val, 'expected a value' # Ask another band. Should be cached val2 = ds.GetRasterBand(2).GetMetadataItem(pixel, "LocationInfo") assert val2 == val, 'expected a value' # Ask an overview band val2 = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem(pixel, "LocationInfo") if val2 != val: if 'java.lang.NullPointerException' in val2 or '504 Gateway Time-out' in val2 or 'java.lang.OutOfMemoryError' in val2: pytest.skip(val2) print(val2) pytest.fail('expected a value') ds = None ############################################################################### # Test a TiledWMS dataset with a color table (#4613) def wms_17(): if gdaltest.wms_drv is None: pytest.skip() srv = 'http://onmoon.lmmp.nasa.gov/sites/wms.cgi?' if gdaltest.gdalurlopen(srv) is None: pytest.skip() name = 'http://onmoon.lmmp.nasa.gov/sites/wms.cgi?King Crater DEM Color Confidence, LMMP' ds = gdal.Open(name) assert ds is not None, ('open of %s failed.' % name) band = ds.GetRasterBand(1) assert band.GetColorTable() is not None ds = None ############################################################################### # Test a ArcGIS Server def test_wms_18(): if gdaltest.wms_drv is None: pytest.skip() # We don't need to check if the remote service is online as we # don't need a connection for this test. fn = 'http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServerxyXYEPSG:3857-20037508.3420037508.3420037508.34-20037508.34512512' ds = gdal.Open(fn) assert ds is not None, 'open failed.' assert ds.RasterXSize == 512 and ds.RasterYSize == 512 and ds.RasterCount == 3, \ 'wrong size or bands' # todo: add locationinfo test # add getting image test if gdaltest.gdalurlopen('http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer') is None: pytest.skip() expected_cs = 12824 cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs, 'Did not get expected checksum.' ds = None # Alternative url with additional parameters fn = 'http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export?dpi=96&layerdefs=&layerTimeOptions=&dynamicLayers=&xyXYEPSG:3857-20037508.3420037508.3420037508.34-20037508.34512512' ds = gdal.Open(fn) assert ds is not None, 'open failed.' assert ds.RasterXSize == 512 and ds.RasterYSize == 512 and ds.RasterCount == 3, \ 'wrong size or bands' cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs, 'Did not get expected checksum.' ds = None ############################################################################### # Test a IIP server def test_wms_19(): if gdaltest.wms_drv is None: pytest.skip() ds = gdal.Open('IIP:http://merovingio.c2rmf.cnrs.fr/fcgi-bin/iipsrv.fcgi?FIF=globe.256x256.tif') if ds is None: if gdaltest.gdalurlopen('http://merovingio.c2rmf.cnrs.fr/fcgi-bin/iipsrv.fcgi?FIF=globe.256x256.tif&obj=Basic-Info') is None: pytest.skip() pytest.fail('open failed.') assert ds.RasterXSize == 86400 and ds.RasterYSize == 43200 and ds.RasterCount == 3, \ 'wrong size or bands' # Expected checksum seems to change over time. Hum... cs = ds.GetRasterBand(1).GetOverview(ds.GetRasterBand(1).GetOverviewCount() - 1).Checksum() assert cs != 0, 'Did not get expected checksum.' ds = None ############################################################################### def test_wms_cleanup(): gdaltest.wms_ds = None gdaltest.clean_tmp() try: shutil.rmtree('gdalwmscache') except OSError: pass gdalautotest-3.2.2/gdrivers/dted.py0000775000175000017500000003011014020414366016011 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: dted.py 2bebf45bd1f2d696b0517b75a31fc7d2b91d9f55 2020-05-10 17:13:35 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test DTED support. # Author: Mateusz Loskot # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # Copyright (c) 2007-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Perform simple read test. def test_dted_1(): tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 49187) return tst.testOpen() ############################################################################### # Verify some auxiliary data. def test_dted_2(): ds = gdal.Open('data/n43.dt0') gt = ds.GetGeoTransform() max_error = 0.000001 assert gt[0] == pytest.approx((-80.004166666666663), abs=max_error) and gt[1] == pytest.approx(0.0083333333333333332, abs=max_error) and gt[2] == pytest.approx(0, abs=max_error) and gt[3] == pytest.approx(44.00416666666667, abs=max_error) and gt[4] == pytest.approx(0, abs=max_error) and gt[5] == pytest.approx((-0.0083333333333333332), abs=max_error), \ 'DTED geotransform wrong.' prj = ds.GetProjection() assert prj == 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', \ ('Projection does not match expected:\n%s' % prj) band1 = ds.GetRasterBand(1) assert band1.GetNoDataValue() == -32767, 'Grid NODATA value wrong or missing.' assert band1.DataType == gdal.GDT_Int16, 'Data type is not Int16!' ############################################################################### # Create simple copy and check. def test_dted_3(): tst = gdaltest.GDALTest('DTED', 'n43.dt0', 1, 49187) prj = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) ############################################################################### # Read subwindow. Tests the tail recursion problem. def test_dted_4(): tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 305, 5, 5, 5, 5) return tst.testOpen() ############################################################################### # Test a DTED Level 1 (made from a DTED Level 0) def test_dted_5(): driver = gdal.GetDriverByName("GTiff") ds = driver.Create('tmp/n43.dt1.tif', 1201, 1201, 1, gdal.GDT_Int16) ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]') ref_geotransform = (-80.0004166666666663, 0.0008333333333333, 0, 44.0004166666666670, 0, -0.0008333333333333) ds.SetGeoTransform(ref_geotransform) ds = None ds = gdal.Open('tmp/n43.dt1.tif') geotransform = ds.GetGeoTransform() for i in range(6): assert geotransform[i] == pytest.approx(ref_geotransform[i], abs=1e-10) ds = None ############################################################################### # Test a DTED Level 2 (made from a DTED Level 0) def test_dted_6(): driver = gdal.GetDriverByName("GTiff") ds = driver.Create('tmp/n43.dt2.tif', 3601, 3601, 1, gdal.GDT_Int16) ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]') ref_geotransform = (-80.0001388888888888888, 0.0002777777777777777, 0, 44.0001388888888888, 0, -0.0002777777777777777) ds.SetGeoTransform(ref_geotransform) ds = None ds = gdal.Open('tmp/n43.dt2.tif') geotransform = ds.GetGeoTransform() for i in range(6): assert geotransform[i] == pytest.approx(ref_geotransform[i], abs=1e-10) ds = None ############################################################################### # Test a WGS72 georeferenced DTED def test_dted_7(): ds = gdal.Open('data/dted/n43_wgs72.dt0') # a warning is issued gdal.PushErrorHandler('CPLQuietErrorHandler') prj = ds.GetProjection() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() is not None, 'An expected warning was not emitted' assert prj.startswith('GEOGCS["WGS 72"') ############################################################################### # Test a file whose checksum is corrupted def test_dted_8(): # this will enable DTED_VERIFY_CHECKSUM gdal.SetConfigOption('DTED_VERIFY_CHECKSUM', 'YES') ds = gdal.Open('data/dted/n43_bad_crc.dt0') band = ds.GetRasterBand(1) # numerous errors would be reported gdal.PushErrorHandler('CPLQuietErrorHandler') chksum = band.Checksum() gdal.PopErrorHandler() gdal.SetConfigOption('DTED_VERIFY_CHECKSUM', 'NO') assert gdal.GetLastErrorMsg() is not None, 'An expected warning was not emitted' # 49187 is the checksum of data is the DTED is read without checking its checksum # so we should not get this value assert chksum != 49187, 'DTED_VERIFY_CHECKSUM=YES has had no effect!' ############################################################################### # Test a DTED Level 1 above latitude 50 (made from a DTED Level 0) def test_dted_9(): ds = gdal.Open('data/n43.dt0') bandSrc = ds.GetRasterBand(1) driver = gdal.GetDriverByName("GTiff") dsDst = driver.Create('tmp/n53.dt1.tif', 601, 1201, 1, gdal.GDT_Int16) dsDst.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]') dsDst.SetGeoTransform((-80.0008333333333333, 0.001666666666667, 0, 54.0004166666666670, 0, -0.0008333333333333)) bandDst = dsDst.GetRasterBand(1) data = bandSrc.ReadRaster(0, 0, 121, 121, 601, 1201, gdal.GDT_Int16) bandDst.WriteRaster(0, 0, 601, 1201, data, 601, 1201, gdal.GDT_Int16) bandDst.FlushCache() bandDst = None ds = None dsDst = None ds = gdal.Open('tmp/n53.dt1.tif') driver = gdal.GetDriverByName("DTED") dsDst = driver.CreateCopy('tmp/n53.dt1', ds) band = dsDst.GetRasterBand(1) chksum = band.Checksum() assert chksum == 36542, ('Wrong checksum. Checksum found %d' % chksum) ############################################################################### # Test creating an in memory copy. def test_dted_10(): tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 49187) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test a DTED file that strictly the original edition of MIL-D-89020 that was # buggy. The latitude and longitude of the LL corner of the UHF record was # inverted. This was fixed in MIL-D-89020 Amendment 1, but some products may # be affected. def test_dted_11(): ds = gdal.Open('data/dted/n43_coord_inverted.dt0') gt = ds.GetGeoTransform() max_error = 0.000001 assert gt[0] == pytest.approx((-80.004166666666663), abs=max_error) and gt[1] == pytest.approx(0.0083333333333333332, abs=max_error) and gt[2] == pytest.approx(0, abs=max_error) and gt[3] == pytest.approx(44.00416666666667, abs=max_error) and gt[4] == pytest.approx(0, abs=max_error) and gt[5] == pytest.approx((-0.0083333333333333332), abs=max_error), \ 'DTED geotransform wrong.' prj = ds.GetProjection() assert prj == 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', \ ('Projection does not match expected:\n%s' % prj) band1 = ds.GetRasterBand(1) assert band1.GetNoDataValue() == -32767, 'Grid NODATA value wrong or missing.' assert band1.DataType == gdal.GDT_Int16, 'Data type is not Int16!' ############################################################################### # Test a DTED file that begins with a HDR record, and not directly the UHL record (#2951) def test_dted_12(): ds = gdal.Open('data/dted/w118n033_trunc.dt1') assert ds is not None ############################################################################### # Test a DTED file that has only a few (sequential) columns. Derived from # a real-world DTED file def test_dted_13(): tst = gdaltest.GDALTest('dted', 'dted/n43_partial_cols.dt0', 1, 56006) return tst.testOpen() ############################################################################### # Test a DTED file that has only a few (non-sequential) columns. Only theoretical # case for now. def test_dted_14(): tst = gdaltest.GDALTest('dted', 'dted/n43_sparse_cols.dt0', 1, 56369) return tst.testOpen() ############################################################################### # Perform simple read test with GDAL_DTED_SINGLE_BLOCK = YES def test_dted_15(): gdal.SetConfigOption('GDAL_DTED_SINGLE_BLOCK', 'YES') tst = gdaltest.GDALTest('dted', 'n43.dt0', 1, 49187) ret = tst.testOpen() gdal.SetConfigOption('GDAL_DTED_SINGLE_BLOCK', None) return ret def test_dted_16(): with gdaltest.config_option('DTED_APPLY_PIXEL_IS_POINT', 'TRUE'): ds = gdal.Open('data/n43.dt0') assert ds is not None max_error = 0.000001 gt = ds.GetGeoTransform() assert gt == pytest.approx((-80.0, 0.0083333333333333332, 0, 44.0, 0, -0.0083333333333333332), abs=max_error) ############################################################################### # Cleanup. def test_dted_cleanup(): try: os.remove('tmp/n43.dt1.tif') os.remove('tmp/n43.dt1.aux.xml') os.remove('tmp/n43.dt1') os.remove('tmp/n53.dt1.tif') os.remove('tmp/n53.dt1.aux.xml') os.remove('tmp/n53.dt1') os.remove('tmp/n43.dt2.tif') os.remove('tmp/n43.dt2.aux.xml') os.remove('tmp/n43.dt2') except OSError: pass gdalautotest-3.2.2/gdrivers/ngsgeoid.py0000775000175000017500000000456614020414366016710 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ngsgeoid.py 6149d1b9cbec68ef34b98b3f909e7136b7b932b2 2020-05-10 17:03:36 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for NGSGEOID driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test opening a little endian file def test_ngsgeoid_1(): tst = gdaltest.GDALTest('NGSGEOID', 'ngsgeoid/g2009u01_le_truncated.bin', 1, 65534) return tst.testOpen(check_gt=(229.99166666666667, 0.016666666666670001, 0.0, 40.00833333333334, 0.0, -0.016666666666670001), check_prj='WGS84') ############################################################################### # Test opening a big endian file def test_ngsgeoid_2(): tst = gdaltest.GDALTest('NGSGEOID', 'ngsgeoid/g2009u01_be_truncated.bin', 1, 65534) return tst.testOpen(check_gt=(229.99166666666667, 0.016666666666670001, 0.0, 40.00833333333334, 0.0, -0.016666666666670001), check_prj='WGS84') gdalautotest-3.2.2/gdrivers/pnm.py0000775000175000017500000000542614020414366015677 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: pnm.py 7f30a849a7dc424bfc398f5640823fb164b5447e 2020-05-10 17:45:22 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: PNM (Portable Anyware Map) Testing. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Read Test grayscale (PGM) def test_pnm_1(): tst = gdaltest.GDALTest('PNM', 'pnm/byte.pgm', 1, 4672) return tst.testOpen() ############################################################################### # Write Test grayscale (PGM) def test_pnm_2(): tst = gdaltest.GDALTest('PNM', 'pnm/byte.pgm', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Read Test RGB (PPM) def test_pnm_3(): tst = gdaltest.GDALTest('PNM', 'pnm/rgbsmall.ppm', 2, 21053) return tst.testOpen() ############################################################################### # Write Test RGB (PPM) def test_pnm_4(): tst = gdaltest.GDALTest('PNM', 'pnm/rgbsmall.ppm', 2, 21053) return tst.testCreateCopy() @pytest.mark.parametrize("nbands", [1, 3]) def test_pnm_write_non_standard_extension(nbands): gdal.ErrorReset() with gdaltest.error_handler(): gdal.GetDriverByName('PNM').Create('foo.foo', 1, 1, nbands) assert gdal.GetLastErrorType() != 0 gdal.Unlink('foo.foo') gdalautotest-3.2.2/gdrivers/cpg.py0000775000175000017500000000347414020414366015657 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: cpg.py ee165ad1784e74686bd2724318202887520dc23f 2020-05-10 15:50:18 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test CPG driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test a fake CPG dataset def test_cpg_1(): tst = gdaltest.GDALTest('CPG', 'cpg/fakecpgSIRC.hdr', 1, 0) return tst.testOpen() gdalautotest-3.2.2/gdrivers/sdts.py0000775000175000017500000000456514020414366016065 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: sdts.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for SDTS driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal from osgeo import osr import gdaltest ############################################################################### # Test a truncated version of an SDTS DEM downloaded at # http://thor-f5.er.usgs.gov/sdts/datasets/raster/dem/dem_oct_2001/1107834.dem.sdts.tar.gz def test_sdts_1(): tst = gdaltest.GDALTest('SDTS', 'STDS_1107834_truncated/1107CATD.DDF', 1, 61672) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') srs.SetUTM(16) tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(666015, 30, 0, 5040735, 0, -30), check_filelist=False) ds = gdal.Open('data/STDS_1107834_truncated/1107CATD.DDF') md = ds.GetMetadata() assert md['TITLE'] == 'ALANSON, MI-24000' gdalautotest-3.2.2/gdrivers/nwt_grc.py0000775000175000017500000000351614020414366016546 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: nwt_grc.py 7dff3af3e4e2bf52a45f0fe700972e95ba17822d 2020-05-10 15:04:41 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Northwood GRC driver # Author: Chaitanya kumar CH, # ############################################################################### # Copyright (c) 2009, Chaitanya kumar CH, # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test a GRC dataset def test_nwt_grc_1(): tst = gdaltest.GDALTest('NWT_GRC', 'nwt_grc/nwt_grc.grc', 1, 46760) return tst.testOpen() gdalautotest-3.2.2/gdrivers/zmap.py0000775000175000017500000000366314020414366016055 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: zmap.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for ZMap driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test CreateCopy() of byte.tif def test_zmap_1(): tst = gdaltest.GDALTest('ZMap', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1, check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) gdalautotest-3.2.2/gdrivers/til.py0000775000175000017500000000615114020414366015671 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: til.py aa4bfb10d5e8d35df9425c0bd254c46e89ed62d2 2020-05-10 14:59:47 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test TIL driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import gdaltest from osgeo import gdal ############################################################################### # Test a fake TIL dataset def test_til_1(): tst = gdaltest.GDALTest('TIL', 'til/testtil.til', 1, 4672) return tst.testOpen() ############################################################################### # Check GetFileList() result (#4018) & IMD def test_til_2(): ds = gdal.Open('data/til/testtil.til') filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' md = ds.GetMetadata('IMAGERY') assert 'SATELLITEID' in md, 'SATELLITEID not present in IMAGERY Domain' assert 'CLOUDCOVER' in md, 'CLOUDCOVER not present in IMAGERY Domain' assert 'ACQUISITIONDATETIME' in md, \ 'ACQUISITIONDATETIME not present in IMAGERY Domain' ds = None assert not os.path.exists('data/til/testtil.til.aux.xml') ############################################################################### # Check GetFileList() & XML def test_til_3(): ds = gdal.Open('data/til/testtil2.til') filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' md = ds.GetMetadata('IMAGERY') assert 'SATELLITEID' in md, 'SATELLITEID not present in IMAGERY Domain' assert 'CLOUDCOVER' in md, 'CLOUDCOVER not present in IMAGERY Domain' assert 'ACQUISITIONDATETIME' in md, \ 'ACQUISITIONDATETIME not present in IMAGERY Domain' ds = None assert not os.path.exists('data/til/testtil.til.aux.xml') gdalautotest-3.2.2/gdrivers/gff.py0000775000175000017500000000430314020414366015640 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: gff.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GFF driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Test an extract from a real dataset def test_gff_1(): # 12088 = 2048 + 8 * 1255 if not gdaltest.download_file('http://sandia.gov/RADAR/complex_data/MiniSAR20050519p0001image008.gff', 'MiniSAR20050519p0001image008.gff', 12088): pytest.skip() tst = gdaltest.GDALTest('GFF', 'tmp/cache/MiniSAR20050519p0001image008.gff', 1, 29757, filename_absolute=1) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = tst.testOpen() gdal.PopErrorHandler() return ret gdalautotest-3.2.2/gdrivers/bt.py0000775000175000017500000000753214020414366015512 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: bt.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for BT driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import osr from osgeo import gdal import gdaltest ############################################################################### # Test CreateCopy() of int16.tif def test_bt_1(): tst = gdaltest.GDALTest('BT', 'int16.tif', 1, 4672) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') return tst.testCreateCopy(vsimem=1, check_srs=srs.ExportToWkt(), check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) ############################################################################### # Test CreateCopy() of int32.tif def test_bt_2(): tst = gdaltest.GDALTest('BT', 'int32.tif', 1, 4672) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') return tst.testCreateCopy(check_srs=srs.ExportToWkt(), check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) ############################################################################### # Test CreateCopy() of float32.tif def test_bt_3(): tst = gdaltest.GDALTest('BT', 'float32.tif', 1, 4672) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('NAD27') return tst.testCreateCopy(check_srs=srs.ExportToWkt(), check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) ############################################################################### # Test Create() of float32.tif def test_bt_4(): tst = gdaltest.GDALTest('BT', 'float32.tif', 1, 4672) return tst.testCreate(out_bands=1) ############################################################################### # Test testSetProjection() of float32.tif def test_bt_5(): tst = gdaltest.GDALTest('BT', 'float32.tif', 1, 4672) return tst.testSetProjection() ############################################################################### # Test testSetGeoTransform() of float32.tif def test_bt_6(): tst = gdaltest.GDALTest('BT', 'float32.tif', 1, 4672) return tst.testSetGeoTransform() ############################################################################### # Cleanup def test_bt_cleanup(): gdal.Unlink('/vsimem/int16.tif.prj') gdal.Unlink('tmp/int32.tif.prj') gdal.Unlink('tmp/float32.tif.prj') gdalautotest-3.2.2/gdrivers/sar_ceos.py0000775000175000017500000000431514020414367016700 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: sar_ceos.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test SAR_CEOS driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest import pytest ############################################################################### def test_sar_ceos_online_1(): list_files = ['ottawa_patch.img', 'ottawa_patch.led', 'ottawa_patch.nul', 'ottawa_patch.trl', 'ottawa_patch.vol'] for filename in list_files: if not gdaltest.download_file('http://download.osgeo.org/gdal/data/ceos/' + filename, filename): pytest.skip() tst = gdaltest.GDALTest('SAR_CEOS', 'tmp/cache/ottawa_patch.img', 1, 23026, filename_absolute=1) return tst.testOpen() gdalautotest-3.2.2/gdrivers/gdalhttp.py0000775000175000017500000002235414020414367016714 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: gdalhttp.py 1741dde638dd3cd3af8f6260f456b6a6a13398c2 2020-06-01 17:37:23 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test HTTP Driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # Copyright (c) 2009-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import subprocess import sys from osgeo import gdal from osgeo import ogr import pytest try: import gdaltest except ImportError: # running as a subprocess in the windows build (see __main__ block), # so conftest.py hasn't run, so sys.path doesn't have pymod in it sys.path.append('../pymod') import gdaltest ############################################################################### # Verify we have the driver. def test_http_1(): gdaltest.dods_drv = None drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() gdaltest.dods_drv = gdal.GetDriverByName('DODS') if gdaltest.dods_drv is not None: gdaltest.dods_drv.Deregister() tst = gdaltest.GDALTest('PNG', 'http://gdal.org/gdalicon.png', 1, 7617, filename_absolute=1) ret = tst.testOpen() if ret == 'fail': conn = gdaltest.gdalurlopen('http://gdal.org/gdalicon.png') if conn is None: pytest.skip('cannot open URL') conn.close() return ret ############################################################################### # Verify /vsicurl (subversion file listing) def test_http_2(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() tst = gdaltest.GDALTest('GTiff', '/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/gcore/data/byte.tif', 1, 4672, filename_absolute=1) ret = tst.testOpen() if ret == 'fail': conn = gdaltest.gdalurlopen('https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/gcore/data/byte.tif') if conn is None: pytest.skip('cannot open URL') conn.close() return ret ############################################################################### # Verify /vsicurl (apache file listing) def test_http_3(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() gdal.SetConfigOption('GDAL_HTTP_TIMEOUT', '5') ds = gdal.Open('/vsicurl/http://download.osgeo.org/gdal/data/ehdr/elggll.bil') gdal.SetConfigOption('GDAL_HTTP_TIMEOUT', None) if ds is None: conn = gdaltest.gdalurlopen('http://download.osgeo.org/gdal/data/ehdr/elggll.bil') if conn is None: pytest.skip('cannot open URL') conn.close() pytest.fail() ############################################################################### # Verify /vsicurl (ftp) def http_4_old(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() ds = gdal.Open('/vsicurl/ftp://ftp2.cits.rncan.gc.ca/pub/cantopo/250k_tif/MCR2010_01.tif') if ds is None: # Workaround unexplained failure on Tamas test machine. The test works fine with his # builds on other machines... # This heuristics might be fragile ! if "GDAL_DATA" in os.environ and os.environ["GDAL_DATA"].find("E:\\builds\\..\\sdk\\") == 0: pytest.skip() conn = gdaltest.gdalurlopen('ftp://ftp2.cits.rncan.gc.ca/pub/cantopo/250k_tif/MCR2010_01.tif') if conn is None: pytest.skip('cannot open URL') conn.close() pytest.fail() filelist = ds.GetFileList() assert filelist[0] == '/vsicurl/ftp://ftp2.cits.rncan.gc.ca/pub/cantopo/250k_tif/MCR2010_01.tif' ############################################################################### # Verify /vsicurl (ftp) def test_http_4(): # Too unreliable if gdaltest.skip_on_travis(): pytest.skip() drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() ds = gdal.Open('/vsicurl/ftp://download.osgeo.org/gdal/data/gtiff/utm.tif') if ds is None: conn = gdaltest.gdalurlopen('ftp://download.osgeo.org/gdal/data/gtiff/utm.tif', timeout=4) if conn is None: pytest.skip('cannot open URL') try: conn.read() except: pytest.skip('cannot read') conn.close() if sys.platform == 'darwin' and gdal.GetConfigOption('TRAVIS', None) is not None: pytest.skip("Fails on MacOSX Travis sometimes. Not sure why.") pytest.fail() filelist = ds.GetFileList() assert '/vsicurl/ftp://download.osgeo.org/gdal/data/gtiff/utm.tif' in filelist ############################################################################### # Test HTTP driver with non VSIL driver def test_http_5(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() ds = gdal.Open('https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/gdrivers/data/s4103.blx') if ds is None: conn = gdaltest.gdalurlopen('https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/gdrivers/data/s4103.blx') if conn is None: pytest.skip('cannot open URL') try: conn.read() except: pytest.skip('cannot read') conn.close() pytest.fail() filename = ds.GetDescription() ds = None with pytest.raises(OSError): os.stat(filename) pytest.fail('file %s should have been removed' % filename) ############################################################################### # Test HTTP driver with OGR driver def test_http_6(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() ds = ogr.Open('https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/ogr/data/poly.dbf') if ds is None: conn = gdaltest.gdalurlopen('https://raw.githubusercontent.com/OSGeo/gdal/release/3.1/autotest/ogr/data/poly.dbf') if conn is None: pytest.skip('cannot open URL') try: conn.read() except: pytest.skip('cannot read') conn.close() pytest.fail() ds = None ############################################################################### def test_http_ssl_verifystatus(): if gdal.GetDriverByName('HTTP') is None: pytest.skip() with gdaltest.config_option('GDAL_HTTP_SSL_VERIFYSTATUS', 'YES'): with gdaltest.error_handler(): # For now this URL doesn't support OCSP stapling... gdal.OpenEx('https://google.com', allowed_drivers=['HTTP']) last_err = gdal.GetLastErrorMsg() if 'No OCSP response received' not in last_err and 'libcurl too old' not in last_err: # The test actually works on Travis Mac if sys.platform == 'darwin' and gdal.GetConfigOption('TRAVIS', None) is not None: pytest.skip() pytest.fail(last_err) ############################################################################### def test_http_use_capi_store(): if gdal.GetDriverByName('HTTP') is None: pytest.skip() if sys.platform != 'win32': with gdaltest.error_handler(): return test_http_use_capi_store_sub() # Prints this to stderr in many cases (but doesn't error) # Warning 6: GDAL_HTTP_USE_CAPI_STORE requested, but libcurl too old, non-Windows platform or OpenSSL missing. subprocess.check_call( [sys.executable, 'gdalhttp.py', '-use_capi_store'], ) def test_http_use_capi_store_sub(): with gdaltest.config_option('GDAL_HTTP_USE_CAPI_STORE', 'YES'): gdal.OpenEx('https://google.com', allowed_drivers=['HTTP']) ############################################################################### # def test_http_cleanup(): if gdaltest.dods_drv is not None: gdaltest.dods_drv.Register() gdaltest.dods_drv = None if __name__ == '__main__': if len(sys.argv) == 2 and sys.argv[1] == '-use_capi_store': test_http_use_capi_store_sub() gdalautotest-3.2.2/gdrivers/generate_bag.py0000775000175000017500000003331214020414367017504 0ustar eveneven#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################### # $Id: generate_bag.py b475f2c395311290ca147fedd993efd7e9f34f09 2020-08-18 15:37:29 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Generate test files # Author: Even Rouault # ############################################################################### # Copyright (c) 2020, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import h5py import numpy as np f = h5py.File('test_georef_metadata.bag','w') bag_root = f.create_group("BAG_root") bag_root.attrs["Bag Version"] = "2.0.0" xml = """ unknown unknown author 2018-08-08 2 row 4 32 column 6 30 point 1 0 100.000000000000,500000.000000000000 250.000000000000,500096.000000000000 center PROJCS["NAD83 / UTM zone 10N", GEOGCS["NAD83", DATUM["North American Datum 1983", SPHEROID["GRS 1980",6378137,298.2572221010041, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6269"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4269"]], PROJECTION["Transverse_Mercator", AUTHORITY["EPSG","16010"]], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-123], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26910"]] WKT VERT_CS["MLLW", VERT_DATUM["MLLW", 2000]] WKT grid eng elevation 0 0 0 0 unknown dataset Generated by bag_vr_create 2018-08-08T12:34:56 unclassified """ metadata = bag_root.create_dataset("metadata", (len(xml),), data = [x for x in xml], dtype = 'S1') elevation = bag_root.create_dataset("elevation", (4, 6), dtype = 'float32', fillvalue = 0) data = np.array([i for i in range(24) ]).reshape(elevation.shape) elevation[...] = data uncertainty = bag_root.create_dataset("uncertainty", (4, 6), dtype = 'float32') varres_metadata_struct_type = np.dtype([('index', 'I'), ('dimensions_x', 'I'), ('dimensions_y', 'I'), ('resolution_x', 'f4'), ('resolution_y', 'f4'), ('sw_corner_x', 'f4'), ('sw_corner_y', 'f4')]) varres_metadata = bag_root.create_dataset("varres_metadata", (4, 6), dtype = varres_metadata_struct_type) varres_metadata.attrs["min_resolution_x"] = 1.0 varres_metadata.attrs["min_resolution_y"] = 1.0 varres_metadata.attrs["max_resolution_x"] = 8.0 varres_metadata.attrs["max_resolution_y"] = 8.0 data = np.array( [(0, 2, 2, 2, 2, 0, 0) for i in range(24)] , dtype = varres_metadata_struct_type).reshape(elevation.shape) data[0][1] = np.array((4, 2, 2, 2, 2, 0, 0) , dtype = varres_metadata_struct_type) varres_metadata[...] = data varres_refinements_struct_type = np.dtype([('depth', 'f4'), ('depth_uncrt', 'f4')]) varres_refinements = bag_root.create_dataset("varres_refinements", (1, 8), dtype = varres_refinements_struct_type) varres_refinements[...] = np.array([[0, 2, 3, 4, 5, 6, 7, 0]]) Georef_metadata = bag_root.create_group("Georef_metadata") layer = Georef_metadata.create_group("layer_with_keys_values") keys = layer.create_dataset("keys", (4, 6), dtype = 'uint32', chunks=(2,3)) keys[...] = np.array([np.arange(6) for i in range(4)]).reshape(elevation.shape) varres_keys = layer.create_dataset("varres_keys", (1, 8), dtype = 'uint32') varres_keys[...] = np.array([1, 1, 1, 0, 0, 1, 1, 1]) comp_type = np.dtype([('int', 'i'), ('str', np.str_, 6), ('float64', 'f8')]) values = layer.create_dataset("values", (6,), dtype = comp_type) data = np.array([(i, "Val ", i + 1.25) for i in range(6) ], dtype = comp_type) values[...] = data layer = Georef_metadata.create_group("layer_with_values_only") values = layer.create_dataset("values", (2,), dtype = comp_type) data = np.array([(i, "Val ", i + 1.25) for i in range(2) ], dtype = comp_type) values[...] = data tracking_list_struct_type = np.dtype([('row', 'I'), ('col', 'I'), ('depth', 'f4'), ('uncertainty', 'f4'), ('track_code', 'B'), ('list_series', 'h')]) tracking_list = bag_root.create_dataset("tracking_list", (2,), dtype = tracking_list_struct_type) tracking_list[...] = np.array([(0,1,2.5,3.5,4,5),(6,7,8.5,9.5,10,11)], dtype = tracking_list_struct_type) gdalautotest-3.2.2/gdrivers/r.py0000775000175000017500000000526414020414367015347 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: r.py 8ae5e359550b3d87db7900cb7afc4f1ede1ae974 2020-05-10 17:14:31 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test R driver support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2009, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Perform simple read test on an ascii file. def test_r_1(): tst = gdaltest.GDALTest('R', 'r/r_test.asc', 2, 202) return tst.testOpen() ############################################################################### # Perform a simple read test on a binary (uncompressed) file. def test_r_2(): tst = gdaltest.GDALTest('R', 'r/r_test.rdb', 1, 202) return tst.testOpen() ############################################################################### # Verify a simple createcopy operation with 16bit data. def test_r_3(): tst = gdaltest.GDALTest('R', 'byte.tif', 1, 4672, options=['ASCII=YES']) return tst.testCreateCopy() ############################################################################### # Test creating a compressed binary stream and reading it back. def test_r_4(): tst = gdaltest.GDALTest('R', 'byte.tif', 1, 4672) return tst.testCreateCopy(new_filename='tmp/r_4.rda') ############################################################################### gdalautotest-3.2.2/gdrivers/postgisraster.py0000775000175000017500000005103314020414367020012 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: postgisraster.py eb84e37b9172776c0ee4520cf3d3d36e3a096cf0 2020-06-03 16:32:20 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: PostGISRaster Testing. # Author: Jorge Arevalo # David Zwarg # ############################################################################### # Copyright (c) 2009, Jorge Arevalo # 2012, David Zwarg # Copyright (c) 2009-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal from osgeo import ogr from osgeo import osr import gdaltest import pytest # # To initialize the required PostGISRaster DB instance, run data/load_postgisraster_test_data.sh # ############################################################################### # def test_postgisraster_init(): gdaltest.postgisrasterDriver = gdal.GetDriverByName('PostGISRaster') if gdaltest.postgisrasterDriver is None: pytest.skip() if gdal.GetConfigOption('APPVEYOR'): gdaltest.postgisrasterDriver = None pytest.skip() val = gdal.GetConfigOption('GDAL_PG_CONNECTION_STRING', None) if val is not None: gdaltest.pg_connection_string = val else: gdaltest.pg_connection_string = "host='localhost' dbname='autotest'" gdaltest.postgisraster_connection_string_without_schema = "PG:" + gdaltest.pg_connection_string gdaltest.postgisraster_connection_string = gdaltest.postgisraster_connection_string_without_schema # Make sure we have SRID=26711 in spatial_ref_sys with gdaltest.error_handler(): ds = ogr.Open(gdaltest.postgisraster_connection_string, update=1) if ds is None: gdaltest.postgisrasterDriver = None pytest.skip() sr = osr.SpatialReference() sr.ImportFromEPSG(26711) wkt = sr.ExportToWkt() proj4 = sr.ExportToProj4() ds.ExecuteSQL("DELETE FROM spatial_ref_sys WHERE auth_srid = 26711") ds.ExecuteSQL("INSERT INTO spatial_ref_sys (srid,auth_name,auth_srid,srtext,proj4text) VALUES (26711,'EPSG',26711,'%s','%s')" % (wkt, proj4)) ds.ExecuteSQL("ALTER DATABASE autotest SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG'") ds.ExecuteSQL("ALTER DATABASE autotest SET postgis.enable_outdb_rasters = true") ds.ExecuteSQL("SELECT pg_reload_conf()") ds = None gdaltest.postgisraster_connection_string += " schema='gis_schema' " with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") # If we cannot open the table, try force loading the data if ds is None: gdaltest.runexternal('bash data/load_postgisraster_test_data.sh') with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") if ds is None: gdaltest.postgisrasterDriver = None if gdaltest.postgisrasterDriver is None: pytest.skip() ############################################################################### # def test_postgisraster_test_open_error1(): if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='nonexistent'") if ds is None: return pytest.fail() ############################################################################### # def test_postgisraster_test_open_error2(): if gdaltest.postgisrasterDriver is None: pytest.skip() # removed mode, as it defaults to one raster per row with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") assert ds is not None ############################################################################### # def test_postgisraster_compare_utm(): if gdaltest.postgisrasterDriver is None: pytest.skip() src_ds = gdal.Open('data/utm.tif') with gdaltest.error_handler(): dst_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") # dataset actually contains many sub-datasets. test the first one dst_ds = gdal.Open(dst_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME']) diff = gdaltest.compare_ds(src_ds, dst_ds, width=100, height=100, verbose=1) assert diff == 0 ############################################################################### # def test_postgisraster_compare_small_world(): if gdaltest.postgisrasterDriver is None: pytest.skip() src_ds = gdal.Open('data/small_world.tif') with gdaltest.error_handler(): dst_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") # dataset actually contains many sub-datasets. test the first one dst_ds = gdal.Open(dst_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME']) diff = gdaltest.compare_ds(src_ds, dst_ds, width=40, height=20, verbose=1) assert diff == 0 ############################################################################### # def test_postgisraster_test_utm_open(): if gdaltest.postgisrasterDriver is None: pytest.skip() # First open tif file src_ds = gdal.Open('data/utm.tif') prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() # Get band data rb = src_ds.GetRasterBand(1) rb.GetStatistics(0, 1) cs = rb.Checksum() with gdaltest.error_handler(): main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='utm'") # Try to open PostGISRaster with the same data than original tif file tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 1, cs, filename_absolute=1) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) ############################################################################### # def test_postgisraster_test_small_world_open_b1(): if gdaltest.postgisrasterDriver is None: pytest.skip() # First open tif file src_ds = gdal.Open('data/small_world.tif') prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() # Get band data rb = src_ds.GetRasterBand(1) rb.GetStatistics(0, 1) cs = rb.Checksum() with gdaltest.error_handler(): main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") # Try to open PostGISRaster with the same data than original tif file tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 1, cs, filename_absolute=1) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) ############################################################################### # def test_postgisraster_test_small_world_open_b2(): if gdaltest.postgisrasterDriver is None: pytest.skip() # First open tif file src_ds = gdal.Open('data/small_world.tif') prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() # Get band data rb = src_ds.GetRasterBand(2) rb.GetStatistics(0, 1) cs = rb.Checksum() with gdaltest.error_handler(): main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") # Try to open PostGISRaster with the same data than original tif file tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 2, cs, filename_absolute=1) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) ############################################################################### # def test_postgisraster_test_small_world_open_b3(): if gdaltest.postgisrasterDriver is None: pytest.skip() # First open tif file src_ds = gdal.Open('data/small_world.tif') prj = src_ds.GetProjectionRef() gt = src_ds.GetGeoTransform() # Get band data rb = src_ds.GetRasterBand(3) rb.GetStatistics(0, 1) cs = rb.Checksum() with gdaltest.error_handler(): main_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") # Checksum for each band can be obtained by gdalinfo -checksum tst = gdaltest.GDALTest('PostGISRaster', main_ds.GetMetadata('SUBDATASETS')['SUBDATASET_1_NAME'], 3, cs, filename_absolute=1) return tst.testOpen(check_prj=prj, check_gt=gt, skip_checksum=True) def test_postgisraster_test_create_copy_bad_conn_string(): if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") new_ds = gdaltest.postgisrasterDriver.CreateCopy("bogus connection string", src_ds, strict=True) assert new_ds is None def test_postgisraster_test_create_copy_no_dbname(): if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") # This is set in order to prevent GDAL from attempting to auto-identify # a bogus PG: filename to the postgis raster driver options = ['APPEND_SUBDATASET=YES'] new_ds = gdaltest.postgisrasterDriver.CreateCopy("PG: no database name", src_ds, strict=True, options=options) assert new_ds is None def test_postgisraster_test_create_copy_no_tablename(): if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") # This is set in order to prevent GDAL from attempting to auto-identify # a bogus PG: filename to the postgis raster driver options = ['APPEND_SUBDATASET=YES'] new_ds = gdaltest.postgisrasterDriver.CreateCopy(gdaltest.postgisraster_connection_string, src_ds, strict=True, options=options) assert new_ds is None def test_postgisraster_test_create_copy_and_delete(): """ Test the "CreateCopy" implementation. What to do when we're done? Why, test "Delete", of course! """ if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") new_ds = gdaltest.postgisrasterDriver.CreateCopy(gdaltest.postgisraster_connection_string + "table='small_world_copy'", src_ds, strict=True) assert new_ds is not None deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy'") assert not deleted def test_postgisraster_test_create_copy_and_delete_phases(): """ Create a copy of the dataset, then delete it in phases. """ if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world'") src_md = src_ds.GetMetadata('SUBDATASETS').keys() new_ds = gdaltest.postgisrasterDriver.CreateCopy(gdaltest.postgisraster_connection_string + "table='small_world_copy'", src_ds, strict=True) new_md = new_ds.GetMetadata('SUBDATASETS').keys() # done with src src_ds = None if new_ds is None: pytest.fail('No new dataset was created during copy.') elif len(src_md) != len(new_md): pytest.fail('Metadata differs between new and old rasters.') ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_copy' mode=2") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] ds = None # should delete all raster parts over 50 deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy' where='rid>50'") assert not deleted, 'Delete returned an error.' src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_copy'") src_md = src_ds.GetMetadata('SUBDATASETS').keys() if src_ds is None: pytest.fail('Could not open reduced dataset (1).') elif len(src_md) != 100: # The length of the metadata contains two pcs of # information per raster, so 50 rasters remaining = 100 keys print(len(src_md)) pytest.fail( 'Expected 100 keys of metadata for 50 subdataset rasters.') # done with src src_ds = None deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy' where='rid<=25'") assert not deleted, 'Delete returned an error.' src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_copy'") src_md = src_ds.GetMetadata('SUBDATASETS').keys() if src_ds is None: pytest.fail('Could not open reduced dataset (2).') elif len(src_md) != 50: # The length of the metadata contains two pcs of # information per raster, so 25 rasters remaining = 50 keys print(len(src_md)) pytest.fail('Expected 50 keys of metadata for 25 subdataset rasters.') # done with src src_ds = None deleted = gdaltest.postgisrasterDriver.Delete(gdaltest.postgisraster_connection_string + "table='small_world_copy'") assert not deleted, 'Delete returned an error.' def test_postgisraster_test_norid(): """ Test the ability to connect to a data source if it has no 'rid' column. """ if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_noid'") src_md = src_ds.GetMetadata('SUBDATASETS') # Check each subdataset for k in src_md.keys(): if k[-4:] == 'NAME': # Ensure the subdataset has upperleftx and upperlefty coords, # as there is no unique key on the table assert src_md[k].find('ST_UpperLeftX') >= 0 and src_md[k].find('ST_UpperLeftY') >= 0 with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_noid' mode=2") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_test_serial(): """ Test the ability to connect to a data source if it has no primary key, but uses a sequence instead. """ if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_serial'") src_md = src_ds.GetMetadata('SUBDATASETS') import re # Check each subdataset for k in src_md.keys(): if k[-4:] == 'NAME': # Ensure the subdataset has upperleftx and upperlefty coords, # as there is no unique key on the table assert re.search(r"""where='"serialid" = \d+'""", src_md[k]), (k, ':', src_md[k]) with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_serial' mode=2") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_test_unique(): """ Test the ability to connect to a data source if it has no primary key, but uses a unique constraint instead. """ if gdaltest.postgisrasterDriver is None: pytest.skip() with gdaltest.error_handler(): src_ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_unique'") src_md = src_ds.GetMetadata('SUBDATASETS') import re # Check each subdataset for k in src_md.keys(): if k[-4:] == 'NAME': # Ensure the subdataset has upperleftx and upperlefty coords, # as there is no unique key on the table assert re.search(r"""where='"uniq" = \d+'""", src_md[k]), (k, ':', src_md[k]) with gdaltest.error_handler(): ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_unique' mode=2") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_test_constraint(): if gdaltest.postgisrasterDriver is None: pytest.skip() ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_constraint' mode=2") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_test_constraint_with_spi(): if gdaltest.postgisrasterDriver is None: pytest.skip() ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_constraint_with_spi' mode=2") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_test_outdb(): if gdaltest.postgisrasterDriver is None: pytest.skip() # For some reason fails with # ERROR 1: PostGISRasterRasterBand::IRasterIO(): ERROR: rt_band_load_offline_data: Cannot open offline raster: /home/travis/build/rouault/gdal/autotest/gdrivers/data/small_world.tif # See https://api.travis-ci.org/v3/job/428972866/log.txt if gdaltest.is_travis_branch('ubuntu_1804'): pytest.skip() ds = ogr.Open(gdaltest.postgisraster_connection_string_without_schema) sql_lyr = ds.ExecuteSQL('SHOW postgis.enable_outdb_rasters') has_guc = sql_lyr is not None ds.ReleaseResultSet(sql_lyr) ds = None ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] expected_cs = [30111, 32302, 40026] if has_guc else [0, 0, 0] assert cs == expected_cs def test_postgisraster_test_outdb_client_side(): if gdaltest.postgisrasterDriver is None: pytest.skip() ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_test_outdb_client_side_force_ireadblock(): if gdaltest.postgisrasterDriver is None: pytest.skip() ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side") with gdaltest.SetCacheMax(0): cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_test_outdb_client_side_if_possible(): if gdaltest.postgisrasterDriver is None: pytest.skip() # For some reason fails with # ERROR 1: PostGISRasterRasterBand::IRasterIO(): ERROR: rt_band_load_offline_data: Cannot open offline raster: /home/travis/build/rouault/gdal/autotest/gdrivers/data/small_world.tif # See https://api.travis-ci.org/v3/job/484385907/log.txt if gdaltest.is_travis_branch('ubuntu_1804'): pytest.skip() ds = gdal.Open(gdaltest.postgisraster_connection_string + "table='small_world_outdb_constraint' mode=2 outdb_resolution=client_side_if_possible") cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert cs == [30111, 32302, 40026] def test_postgisraster_cleanup(): gdal.Unlink('data/small_world.tif.aux.xml') gdal.Unlink('data/utm.tif.aux.xml') gdalautotest-3.2.2/gdrivers/doq1.py0000775000175000017500000000366114020414367015751 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: doq1.py 0f7f0ff93c0954c79a1fc068b67f2a9f292105cf 2020-05-10 15:47:14 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test DOQ1 driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Test a fake DOQ1 dataset def test_doq1_1(): tst = gdaltest.GDALTest('DOQ1', 'doq1/fakedoq1.doq', 1, 1) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = tst.testOpen() gdal.PopErrorHandler() return ret gdalautotest-3.2.2/gdrivers/adrg.py0000775000175000017500000001540514020414367016021 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: adrg.py 440be810ede2a1141cdfe351d3ff29be25a31b26 2020-05-10 15:36:32 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for ADRG driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2007-2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil from osgeo import gdal import gdaltest ############################################################################### # Read test of simple byte reference data. def test_adrg_read_gen(): tst = gdaltest.GDALTest('ADRG', 'adrg/SMALL_ADRG/ABCDEF01.GEN', 1, 62833) return tst.testOpen() ############################################################################### # Read test of simple byte reference data by the TRANSH01.THF file . def test_adrg_read_transh(): tst = gdaltest.GDALTest('ADRG', 'adrg/SMALL_ADRG/TRANSH01.THF', 1, 62833) return tst.testOpen() ############################################################################### # Read test of simple byte reference data by a subdataset file def test_adrg_read_subdataset_img(): tst = gdaltest.GDALTest('ADRG', 'ADRG:data/adrg/SMALL_ADRG/ABCDEF01.GEN,data/adrg/SMALL_ADRG/ABCDEF01.IMG', 1, 62833, filename_absolute=1) return tst.testOpen() ############################################################################### # Test copying. def test_adrg_copy(): drv = gdal.GetDriverByName('ADRG') srcds = gdal.Open('data/adrg/SMALL_ADRG/ABCDEF01.GEN') dstds = drv.CreateCopy('tmp/ABCDEF01.GEN', srcds) chksum = dstds.GetRasterBand(1).Checksum() assert chksum == 62833, 'Wrong checksum' dstds = None drv.Delete('tmp/ABCDEF01.GEN') ############################################################################### # Test creating a fake 2 subdataset image and reading it. def test_adrg_2subdatasets(): drv = gdal.GetDriverByName('ADRG') srcds = gdal.Open('data/adrg/SMALL_ADRG/ABCDEF01.GEN') gdal.SetConfigOption('ADRG_SIMULATE_MULTI_IMG', 'ON') dstds = drv.CreateCopy('tmp/XXXXXX01.GEN', srcds) del dstds gdal.SetConfigOption('ADRG_SIMULATE_MULTI_IMG', 'OFF') shutil.copy('tmp/XXXXXX01.IMG', 'tmp/XXXXXX02.IMG') ds = gdal.Open('tmp/TRANSH01.THF') assert ds.RasterCount == 0, 'did not expected non 0 RasterCount' ds = None ds = gdal.Open('ADRG:tmp/XXXXXX01.GEN,tmp/XXXXXX02.IMG') chksum = ds.GetRasterBand(1).Checksum() assert chksum == 62833, 'Wrong checksum' md = ds.GetMetadata('') assert md['ADRG_NAM'] == 'XXXXXX02', 'metadata wrong.' ds = None os.remove('tmp/XXXXXX01.GEN') os.remove('tmp/XXXXXX01.GEN.aux.xml') os.remove('tmp/XXXXXX01.IMG') os.remove('tmp/XXXXXX02.IMG') os.remove('tmp/TRANSH01.THF') ############################################################################### # Test creating an in memory copy. def test_adrg_copy_vsimem(): drv = gdal.GetDriverByName('ADRG') srcds = gdal.Open('data/adrg/SMALL_ADRG/ABCDEF01.GEN') dstds = drv.CreateCopy('/vsimem/ABCDEF01.GEN', srcds) chksum = dstds.GetRasterBand(1).Checksum() assert chksum == 62833, 'Wrong checksum' dstds = None # Reopen file ds = gdal.Open('/vsimem/ABCDEF01.GEN') chksum = ds.GetRasterBand(1).Checksum() assert chksum == 62833, 'Wrong checksum' ds = None drv.Delete('/vsimem/ABCDEF01.GEN') gdal.Unlink('/vsimem/TRANSH01.THF') ############################################################################### # Test reading a fake North Polar dataset (#6560) def test_adrg_zna_9(): ds = gdal.Open('data/adrg/SMALL_ADRG_ZNA9/ABCDEF01.GEN') expected_gt = (-307675.73602473765, 100.09145391818853, 0.0, -179477.5051066006, 0.0, -100.09145391818853) gt = ds.GetGeoTransform() assert max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-5, \ 'Wrong geotransfsorm' wkt = ds.GetProjectionRef() assert wkt == """PROJCS["ARC_System_Zone_09",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ 'Wrong WKT' ############################################################################### # Test reading a fake South Polar dataset (#6560) def test_adrg_zna_18(): ds = gdal.Open('data/adrg/SMALL_ADRG_ZNA18/ABCDEF01.GEN') expected_gt = (-307675.73602473765, 100.09145391818853, 0.0, 179477.5051066006, 0.0, -100.09145391818853) gt = ds.GetGeoTransform() assert max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-5, \ 'Wrong geotransfsorm' wkt = ds.GetProjectionRef() assert wkt == """PROJCS["ARC_System_Zone_18",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6378137,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",-90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ 'Wrong WKT' ############################################################################### gdalautotest-3.2.2/gdrivers/tiff_profile.py0000775000175000017500000003663614020414367017565 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tiff_profile.py 2da6e90962a140a55650fd7ccf263cbf84c52b9c 2019-08-07 14:31:52 +1200 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic support for ICC profile in TIFF file. # ############################################################################### # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. ############################################################################### ############################################################################### # This unit test uses a free ICC profile by Marti Maria (littleCMS) # # sRGB.icc uses the zlib license. # Part of a free package of ICC profile found at: # http://sourceforge.net/projects/openicc/files/OpenICC-Profiles/ import os import sys import base64 from osgeo import gdal import pytest ############################################################################### # Test writing and reading of ICC profile in Create() options def test_tiff_write_icc(): f = open('data/sRGB.icc', 'rb') data = f.read() icc = base64.b64encode(data).decode('ascii') f.close() # Create dummy file options = ['SOURCE_ICC_PROFILE=' + icc] driver = gdal.GetDriverByName('GTiff') ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) # Check with dataset from Create() md = ds.GetMetadata("COLOR_PROFILE") ds = None with pytest.raises(OSError): os.stat('tmp/icc_test.tiff.aux.xml') assert md['SOURCE_ICC_PROFILE'] == icc # Check again with dataset from Open() ds = gdal.Open('tmp/icc_test.tiff') md = ds.GetMetadata("COLOR_PROFILE") ds = None with pytest.raises(OSError): os.stat('tmp/icc_test.tiff.aux.xml') assert md['SOURCE_ICC_PROFILE'] == icc # Check again with GetMetadataItem() ds = gdal.Open('tmp/icc_test.tiff') source_icc_profile = ds.GetMetadataItem("SOURCE_ICC_PROFILE", "COLOR_PROFILE") ds = None with pytest.raises(OSError): os.stat('tmp/icc_test.tiff.aux.xml') assert source_icc_profile == icc driver.Delete('tmp/icc_test.tiff') ############################################################################### # Test writing and reading of ICC profile in CreateCopy() def test_tiff_copy_icc(): f = open('data/sRGB.icc', 'rb') data = f.read() icc = base64.b64encode(data).decode('ascii') f.close() # Create dummy file options = ['SOURCE_ICC_PROFILE=' + icc] driver = gdal.GetDriverByName('GTiff') ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds) # Check with dataset from CreateCopy() md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE'] == icc # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test2.tiff') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE'] == icc driver.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test2.tiff') ############################################################################### # Test writing and reading of ICC profile in CreateCopy() options def test_tiff_copy_options_icc(): f = open('data/sRGB.icc', 'rb') data = f.read() icc = base64.b64encode(data).decode('ascii') f.close() # Create dummy file options = ['SOURCE_ICC_PROFILE=' + icc] driver = gdal.GetDriverByName('GTiff') ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds, options=options) # Check with dataset from CreateCopy() md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE'] == icc # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test2.tiff') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE'] == icc driver.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test2.tiff') def cvtTuple2String(t): return str(t).lstrip('([').rstrip(')]') ############################################################################### # Test writing and reading of ICC colorimetric data from options def test_tiff_copy_options_colorimetric_data(): # sRGB values source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) tifftag_transferfunction = (list(range(1, 256 * 4, 4)), list(range(2, 256 * 4 + 1, 4)), list(range(3, 256 * 4 + 2, 4))) options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint), 'TIFFTAG_TRANSFERFUNCTION_RED=' + cvtTuple2String(tifftag_transferfunction[0]), 'TIFFTAG_TRANSFERFUNCTION_GREEN=' + cvtTuple2String(tifftag_transferfunction[1]), 'TIFFTAG_TRANSFERFUNCTION_BLUE=' + cvtTuple2String(tifftag_transferfunction[2]) ] driver = gdal.GetDriverByName('GTiff') ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) tifftag_transferfunction2 = ( eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) assert tifftag_transferfunction2 == tifftag_transferfunction # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test2.tiff') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) tifftag_transferfunction2 = ( eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) assert tifftag_transferfunction2 == tifftag_transferfunction driver.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test2.tiff') ############################################################################### # Test writing and reading of ICC colorimetric data in the file def test_tiff_copy_colorimetric_data(): # sRGB values source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) tifftag_transferfunction = (list(range(1, 256 * 4, 4)), list(range(2, 256 * 4 + 1, 4)), list(range(3, 256 * 4 + 2, 4))) options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint), 'TIFFTAG_TRANSFERFUNCTION_RED=' + cvtTuple2String(tifftag_transferfunction[0]), 'TIFFTAG_TRANSFERFUNCTION_GREEN=' + cvtTuple2String(tifftag_transferfunction[1]), 'TIFFTAG_TRANSFERFUNCTION_BLUE=' + cvtTuple2String(tifftag_transferfunction[2]) ] driver = gdal.GetDriverByName('GTiff') ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) ds = None ds = gdal.Open('tmp/icc_test.tiff') # Check with dataset from CreateCopy() ds2 = driver.CreateCopy('tmp/icc_test2.tiff', ds) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) tifftag_transferfunction2 = ( eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) assert tifftag_transferfunction2 == tifftag_transferfunction # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test2.tiff') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) tifftag_transferfunction2 = ( eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) assert tifftag_transferfunction2 == tifftag_transferfunction driver.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test2.tiff') ############################################################################### # Test updating ICC profile def test_tiff_update_icc(): f = open('data/sRGB.icc', 'rb') data = f.read() icc = base64.b64encode(data) f.close() # Create dummy file driver = gdal.GetDriverByName('GTiff') ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) ds = None ds = gdal.Open('tmp/icc_test.tiff', gdal.GA_Update) if sys.version_info >= (3, 0, 0): icc = icc.decode('ascii') ds.SetMetadataItem('SOURCE_ICC_PROFILE', icc, 'COLOR_PROFILE') md = ds.GetMetadata("COLOR_PROFILE") ds = None assert md['SOURCE_ICC_PROFILE'] == icc # Reopen the file to verify it was written. ds = gdal.Open('tmp/icc_test.tiff') md = ds.GetMetadata("COLOR_PROFILE") ds = None assert md['SOURCE_ICC_PROFILE'] == icc driver.Delete('tmp/icc_test.tiff') ############################################################################### # Test updating colorimetric options def test_tiff_update_colorimetric(): source_primaries = [(0.234, 0.555, 1.0), (0.2, 0, 1), (2, 3.5, 1)] source_whitepoint = (0.31271, 0.32902, 1.0) tifftag_transferfunction = (list(range(1, 256 * 4, 4)), list(range(2, 256 * 4 + 1, 4)), list(range(3, 256 * 4 + 2, 4))) # Create dummy file driver = gdal.GetDriverByName('GTiff') ds = driver.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) ds = None ds = gdal.Open('tmp/icc_test.tiff', gdal.GA_Update) ds.SetMetadataItem('SOURCE_PRIMARIES_RED', cvtTuple2String(source_primaries[0]), 'COLOR_PROFILE') ds.SetMetadataItem('SOURCE_PRIMARIES_GREEN', cvtTuple2String(source_primaries[1]), 'COLOR_PROFILE') ds.SetMetadataItem('SOURCE_PRIMARIES_BLUE', cvtTuple2String(source_primaries[2]), 'COLOR_PROFILE') ds.SetMetadataItem('SOURCE_WHITEPOINT', cvtTuple2String(source_whitepoint), 'COLOR_PROFILE') ds.SetMetadataItem('TIFFTAG_TRANSFERFUNCTION_RED', cvtTuple2String(tifftag_transferfunction[0]), 'COLOR_PROFILE') ds.SetMetadataItem('TIFFTAG_TRANSFERFUNCTION_GREEN', cvtTuple2String(tifftag_transferfunction[1]), 'COLOR_PROFILE') ds.SetMetadataItem('TIFFTAG_TRANSFERFUNCTION_BLUE', cvtTuple2String(tifftag_transferfunction[2]), 'COLOR_PROFILE') md = ds.GetMetadata("COLOR_PROFILE") ds = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) tifftag_transferfunction2 = ( eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) assert tifftag_transferfunction2 == tifftag_transferfunction # Reopen the file to verify it was written. ds = gdal.Open('tmp/icc_test.tiff') md = ds.GetMetadata("COLOR_PROFILE") ds = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) tifftag_transferfunction2 = ( eval('[' + md['TIFFTAG_TRANSFERFUNCTION_RED'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_GREEN'] + ']'), eval('[' + md['TIFFTAG_TRANSFERFUNCTION_BLUE'] + ']')) assert tifftag_transferfunction2 == tifftag_transferfunction driver.Delete('tmp/icc_test.tiff') ############################################################################ gdalautotest-3.2.2/gdrivers/ecrgtoc.py0000775000175000017500000002453514020414367016536 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ecrgtoc.py 2da6e90962a140a55650fd7ccf263cbf84c52b9c 2019-08-07 14:31:52 +1200 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for ECRGTOC driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Basic test def test_ecrgtoc_1(): toc_xml = """ TOC.xml clfc\\2 001 lf 2 clfc\\2 001 lf 2 LF 1:500 K (LFC Day) 1:500 K LFC Day """ f = gdal.VSIFOpenL('/vsimem/TOC.xml', 'wb') gdal.VSIFWriteL(toc_xml, 1, len(toc_xml), f) gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/TOC.xml') assert ds is not None expected_gt = [-85.43147208121826, 0.00059486040609137061, 0.0, 33.166986564299428, 0.0, -0.00044985604606525913] gt = ds.GetGeoTransform() for i in range(6): if gt[i] != pytest.approx(expected_gt[i], abs=1e-10): gdaltest.post_reason('did not get expected geotransform') print(gt) wkt = ds.GetProjectionRef() assert wkt.find('WGS 84') != -1, 'did not get expected SRS' filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected filelist' ds2 = gdal.GetDriverByName('NITF').Create('/vsimem/clfc/2/000000009s0013.lf2', 2304, 2304, 3, options=['ICORDS=G', 'TRE=GEOLOB=000605184000800256-85.43147208122+33.16698656430']) ds2.SetGeoTransform([-85.43147208122, 0.00059486040609137061, 0.0, 33.16698656430, 0.0, -0.00044985604606525913]) ds2.SetProjection(wkt) ds2.GetRasterBand(1).Fill(255) ds2 = None ds2 = gdal.GetDriverByName('NITF').Create('/vsimem/clfc/2/000000009t0013.lf2', 2304, 2304, 3, options=['ICORDS=G', 'TRE=GEOLOB=000605184000800256-84.06091370558+33.16698656430']) ds2.SetGeoTransform([-84.06091370558, 0.00059486040609137061, 0.0, 33.16698656430, 0.0, -0.00044985604606525913]) ds2.SetProjection(wkt) ds2 = None cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 5966, 'bad checksum' ############################################################################### # Test overviews def test_ecrgtoc_2(): ds = gdal.Open('/vsimem/TOC.xml') ds.BuildOverviews('NEAR', [2]) ds = None ds = gdal.Open('/vsimem/TOC.xml') filelist = ds.GetFileList() assert len(filelist) == 4, 'did not get expected filelist' ds = None ############################################################################### # Test opening subdataset def test_ecrgtoc_3(): # Try different errors for name in ['ECRG_TOC_ENTRY:', 'ECRG_TOC_ENTRY:ProductTitle', 'ECRG_TOC_ENTRY:ProductTitle:DiscId', 'ECRG_TOC_ENTRY:ProductTitle:DiscId:not_existing', 'ECRG_TOC_ENTRY:ProductTitle:DiscId:c:/not_existing', 'ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:not_existing', 'ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:c:/not_existing', 'ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:c:/not_existing:extra', 'ECRG_TOC_ENTRY:ProductTitle:DiscId:inexisting_scale:/vsimem/TOC.xml', 'ECRG_TOC_ENTRY:ProductTitle:DiscId2:/vsimem/TOC.xml', 'ECRG_TOC_ENTRY:ProductTitle2:DiscId:/vsimem/TOC.xml']: gdal.PushErrorHandler() ds = gdal.Open(name) gdal.PopErrorHandler() assert ds is None, name # Legacy syntax ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:/vsimem/TOC.xml') assert ds is not None ds = None ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:/vsimem/TOC.xml') assert ds is not None ds = None gdal.Unlink('/vsimem/TOC.xml') gdal.Unlink('/vsimem/TOC.xml.1.ovr') gdal.Unlink('/vsimem/clfc/2/000000009s0013.lf2') gdal.Unlink('/vsimem/clfc/2/000000009t0013.lf2') ############################################################################### # Test dataset with 3 subdatasets def test_ecrgtoc_4(): toc_xml = """ TOC.xml clfc\\2 001 lf 2 clfc\\2 001 lf 2 clfc\\2 001 lf 2 LF 1:500 K (LFC Day) 1:500 K LFC Day """ f = gdal.VSIFOpenL('/vsimem/TOC.xml', 'wb') gdal.VSIFWriteL(toc_xml, 1, len(toc_xml), f) gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/TOC.xml') assert ds is not None assert ds.RasterCount == 0, 'bad raster count' expected_gt = (-85.43147208121826, 0.00059486040609137061, 0.0, 37.241379310344833, 0.0, -0.00044985604606525913) gt = ds.GetGeoTransform() for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-10), 'did not get expected geotransform' wkt = ds.GetProjectionRef() assert wkt.find('WGS 84') != -1, 'did not get expected SRS' filelist = ds.GetFileList() assert len(filelist) == 4, 'did not get expected filelist' subdatasets = ds.GetMetadata('SUBDATASETS') if len(subdatasets) != 6: print(filelist) pytest.fail('did not get expected subdatasets') ds = None ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:1_500_K:/vsimem/TOC.xml') assert ds is not None, 'did not get subdataset' ds = None ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:1_1000_K:/vsimem/TOC.xml') assert ds is not None, 'did not get subdataset' ds = None ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId2:1_500_K:/vsimem/TOC.xml') assert ds is not None, 'did not get subdataset' ds = None gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('ECRG_TOC_ENTRY:ProductTitle:DiscId:/vsimem/TOC.xml') gdal.PopErrorHandler() assert ds is None, 'should not have got subdataset' gdal.Unlink('/vsimem/TOC.xml') ############################################################################### def test_ecrgtoc_online_1(): if not gdaltest.download_file('http://www.falconview.org/trac/FalconView/downloads/17', 'ECRG_Sample.zip'): pytest.skip() try: os.stat('tmp/cache/ECRG_Sample.zip') except OSError: pytest.skip() ds = gdal.Open('/vsizip/tmp/cache/ECRG_Sample.zip/ECRG_Sample/EPF/TOC.xml') assert ds is not None expected_gt = (-85.43147208121826, 0.00059486040609137061, 0.0, 35.239923224568145, 0.0, -0.00044985604606525913) gt = ds.GetGeoTransform() for i in range(6): if gt[i] != pytest.approx(expected_gt[i], abs=1e-10): gdaltest.post_reason('did not get expected geotransform') print(gt) wkt = ds.GetProjectionRef() assert wkt.find('WGS 84') != -1, 'did not get expected SRS' filelist = ds.GetFileList() assert len(filelist) == 7, 'did not get expected filelist' gdalautotest-3.2.2/gdrivers/gtx.py0000775000175000017500000000347114020414367015706 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: gsc.py 16265 2009-02-08 11:15:27Z rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GSC driver # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2010, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test reading a small gtx file. def test_gtx_1(): tst = gdaltest.GDALTest('GTX', 'gtx/hydroc1.gtx', 1, 64183) gt = (276.725, 0.05, 0.0, 42.775, 0.0, -0.05) return tst.testOpen(check_gt=gt, check_prj='WGS84') gdalautotest-3.2.2/gdrivers/hdf5.py0000775000175000017500000004130714020414367015732 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: hdf5.py 7bfecfa72d986a33e07ea3110f2e5d38803a167a 2020-11-23 17:07:35 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for HDF5 driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import shutil import pytest from osgeo import gdal import gdaltest from uffd import uffd_compare ############################################################################### # Test if HDF5 driver is present pytestmark = pytest.mark.require_driver('HDF5') @pytest.fixture(autouse=True) def check_no_file_leaks(): num_files = len(gdaltest.get_opened_files()) yield diff = len(gdaltest.get_opened_files()) - num_files assert diff == 0, 'Leak of file handles: %d leaked' % diff ############################################################################### # Confirm expected subdataset information. def test_hdf5_2(): ds = gdal.Open('data/hdf5/groups.h5') sds_list = ds.GetMetadata('SUBDATASETS') assert len(sds_list) == 4, 'Did not get expected subdataset count.' assert sds_list['SUBDATASET_1_NAME'] == 'HDF5:"data/hdf5/groups.h5"://MyGroup/Group_A/dset2' and sds_list['SUBDATASET_2_NAME'] == 'HDF5:"data/hdf5/groups.h5"://MyGroup/dset1', \ 'did not get expected subdatasets.' ds = None assert not gdaltest.is_file_open('data/hdf5/groups.h5'), 'file still opened.' ############################################################################### # Confirm that single variable files can be accessed directly without # subdataset stuff. def test_hdf5_3(): ds = gdal.Open('HDF5:"data/hdf5/u8be.h5"://TestArray') cs = ds.GetRasterBand(1).Checksum() assert cs == 135, 'did not get expected checksum' ds = None assert not gdaltest.is_file_open('data/hdf5/u8be.h5'), 'file still opened.' ############################################################################### # Confirm subdataset access, and checksum. def test_hdf5_4(): ds = gdal.Open('HDF5:"data/hdf5/u8be.h5"://TestArray') cs = ds.GetRasterBand(1).Checksum() assert cs == 135, 'did not get expected checksum' ############################################################################### # Similar check on a 16bit dataset. def test_hdf5_5(): ds = gdal.Open('HDF5:"data/hdf5/groups.h5"://MyGroup/dset1') cs = ds.GetRasterBand(1).Checksum() assert cs == 18, 'did not get expected checksum' ############################################################################### # Test generating an overview on a subdataset. def test_hdf5_6(): shutil.copyfile('data/hdf5/groups.h5', 'tmp/groups.h5') ds = gdal.Open('HDF5:"tmp/groups.h5"://MyGroup/dset1') ds.BuildOverviews(overviewlist=[2]) ds = None assert not gdaltest.is_file_open('tmp/groups.h5'), 'file still opened.' ds = gdal.Open('HDF5:"tmp/groups.h5"://MyGroup/dset1') assert ds.GetRasterBand(1).GetOverviewCount() == 1, 'failed to find overview' ds = None # confirm that it works with a different path. (#3290) ds = gdal.Open('HDF5:"data/../tmp/groups.h5"://MyGroup/dset1') assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ 'failed to find overview with alternate path' ovfile = ds.GetMetadataItem('OVERVIEW_FILE', 'OVERVIEWS') assert ovfile[:11] == 'data/../tmp', 'did not get expected OVERVIEW_FILE.' ds = None gdaltest.clean_tmp() ############################################################################### # Coarse metadata check (regression test for #2412). def test_hdf5_7(): ds = gdal.Open('data/hdf5/metadata.h5') metadata = ds.GetMetadata() metadataList = ds.GetMetadata_List() ds = None assert not gdaltest.is_file_open('data/hdf5/metadata.h5'), 'file still opened.' assert len(metadata) == len(metadataList), 'error in metadata dictionary setup' metadataList = [item.split('=', 1)[0] for item in metadataList] for key in metadataList: try: metadata.pop(key) except KeyError: pytest.fail('unable to find "%s" key' % key) ############################################################################### # Test metadata names. def test_hdf5_8(): ds = gdal.Open('data/hdf5/metadata.h5') metadata = ds.GetMetadata() ds = None assert metadata, 'no metadata found' h5groups = ['G1', 'Group with spaces', 'Group_with_underscores', 'Group with spaces_and_underscores'] h5datasets = ['D1', 'Dataset with spaces', 'Dataset_with_underscores', 'Dataset with spaces_and_underscores'] attributes = { 'attribute': 'value', 'attribute with spaces': 0, 'attribute_with underscores': 0, 'attribute with spaces_and_underscores': .1, } def scanMetadata(parts): for attr in attributes: name = '_'.join(parts + [attr]) name = name.replace(' ', '_') assert name in metadata, ('unable to find metadata: "%s"' % name) value = metadata.pop(name) value = value.strip(' d') value = type(attributes[attr])(value) assert value == attributes[attr], ('incorrect metadata value for "%s": ' '"%s" != "%s"' % (name, value, attributes[attr])) # level0 assert scanMetadata([]) is None # level1 datasets for h5dataset in h5datasets: assert scanMetadata([h5dataset]) is None # level1 groups for h5group in h5groups: assert scanMetadata([h5group]) is None # level2 datasets for h5dataset in h5datasets: assert scanMetadata([h5group, h5dataset]) is None ############################################################################### # Variable length string metadata check (regression test for #4228). def test_hdf5_9(): if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would crash') ds = gdal.Open('data/hdf5/vlstr_metadata.h5') metadata = ds.GetRasterBand(1).GetMetadata() ds = None assert not gdaltest.is_file_open('data/hdf5/vlstr_metadata.h5'), 'file still opened.' ref_metadata = { 'TEST_BANDNAMES': 'SAA', 'TEST_CODING': '0.6666666667 0.0000000000 TRUE', 'TEST_FLAGS': '255=noValue', 'TEST_MAPPING': 'Geographic Lat/Lon 0.5000000000 0.5000000000 27.3154761905 -5.0833333333 0.0029761905 0.0029761905 WGS84 Degrees', 'TEST_NOVALUE': '255', 'TEST_RANGE': '0 255 0 255', } assert len(metadata) == len(ref_metadata), ('incorrect number of metadata: ' 'expected %d, got %d' % (len(ref_metadata), len(metadata))) for key in metadata: assert key in ref_metadata, ('unexpected metadata key "%s"' % key) assert metadata[key] == ref_metadata[key], \ ('incorrect metadata value for key "%s": ' 'expected "%s", got "%s" ' % (key, ref_metadata[key], metadata[key])) ############################################################################### # Test CSK_DGM.h5 (#4160) def test_hdf5_10(): # Try opening the QLK subdataset to check that no error is generated gdal.ErrorReset() ds = gdal.Open('HDF5:"data/hdf5/CSK_DGM.h5"://S01/QLK') assert ds is not None and gdal.GetLastErrorMsg() == '' ds = None ds = gdal.Open('HDF5:"data/hdf5/CSK_DGM.h5"://S01/SBI') got_gcpprojection = ds.GetGCPProjection() assert got_gcpprojection.startswith('GEOGCS["WGS 84",DATUM["WGS_1984"') got_gcps = ds.GetGCPs() assert len(got_gcps) == 4 assert (got_gcps[0].GCPPixel == pytest.approx(0, abs=1e-5) and got_gcps[0].GCPLine == pytest.approx(0, abs=1e-5) and \ got_gcps[0].GCPX == pytest.approx(12.2395902509238, abs=1e-5) and got_gcps[0].GCPY == pytest.approx(44.7280047434954, abs=1e-5)) ds = None assert not gdaltest.is_file_open('data/hdf5/CSK_DGM.h5'), 'file still opened.' ############################################################################### # Test CSK_GEC.h5 (#4160) def test_hdf5_11(): # Try opening the QLK subdataset to check that no error is generated gdal.ErrorReset() ds = gdal.Open('HDF5:"data/hdf5/CSK_GEC.h5"://S01/QLK') assert ds is not None and gdal.GetLastErrorMsg() == '' ds = None ds = gdal.Open('HDF5:"data/hdf5/CSK_GEC.h5"://S01/SBI') got_projection = ds.GetProjection() assert got_projection.startswith('PROJCS["Transverse_Mercator",GEOGCS["WGS 84",DATUM["WGS_1984"') got_gt = ds.GetGeoTransform() expected_gt = (275592.5, 2.5, 0.0, 4998152.5, 0.0, -2.5) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-5) ds = None assert not gdaltest.is_file_open('data/hdf5/CSK_GEC.h5'), 'file still opened.' ############################################################################### # Test ODIM_H5 (#5032) def test_hdf5_12(): if not gdaltest.download_file('http://trac.osgeo.org/gdal/raw-attachment/ticket/5032/norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf', 'norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf'): pytest.skip() ds = gdal.Open('tmp/cache/norsa.ss.ppi-00.5-dbz.aeqd-1000.20070601T000039Z.hdf') got_projection = ds.GetProjection() assert 'Azimuthal_Equidistant' in got_projection got_gt = ds.GetGeoTransform() expected_gt = (-239999.9823595533, 997.9165855496311, 0.0, 239000.03320328312, 0.0, -997.9167782264051) assert max([abs(got_gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-5, got_gt ############################################################################### # Test MODIS L2 HDF5 GCPs (#6666) def test_hdf5_13(): if not gdaltest.download_file('http://oceandata.sci.gsfc.nasa.gov/cgi/getfile/A2016273115000.L2_LAC_OC.nc', 'A2016273115000.L2_LAC_OC.nc'): pytest.skip() ds = gdal.Open('HDF5:"tmp/cache/A2016273115000.L2_LAC_OC.nc"://geophysical_data/Kd_490') got_gcps = ds.GetGCPs() assert len(got_gcps) == 3030 assert (got_gcps[0].GCPPixel == pytest.approx(0.5, abs=1e-5) and got_gcps[0].GCPLine == pytest.approx(0.5, abs=1e-5) and \ got_gcps[0].GCPX == pytest.approx(33.1655693, abs=1e-5) and got_gcps[0].GCPY == pytest.approx(39.3207207, abs=1e-5)) ############################################################################### # Test complex data subsets def test_hdf5_14(): ds = gdal.Open('data/hdf5/complex.h5') sds_list = ds.GetMetadata('SUBDATASETS') assert len(sds_list) == 6, 'Did not get expected complex subdataset count.' assert sds_list['SUBDATASET_1_NAME'] == 'HDF5:"data/hdf5/complex.h5"://f16' and sds_list['SUBDATASET_2_NAME'] == 'HDF5:"data/hdf5/complex.h5"://f32' and sds_list['SUBDATASET_3_NAME'] == 'HDF5:"data/hdf5/complex.h5"://f64', \ 'did not get expected subdatasets.' ds = None assert not gdaltest.is_file_open('data/hdf5/complex.h5'), 'file still opened.' ############################################################################### # Confirm complex subset data access and checksum # Start with Float32 def test_hdf5_15(): ds = gdal.Open('HDF5:"data/hdf5/complex.h5"://f32') cs = ds.GetRasterBand(1).Checksum() assert cs == 523, 'did not get expected checksum' # Repeat for Float64 def test_hdf5_16(): ds = gdal.Open('HDF5:"data/hdf5/complex.h5"://f64') cs = ds.GetRasterBand(1).Checksum() assert cs == 511, 'did not get expected checksum' # Repeat for Float16 def test_hdf5_17(): ds = gdal.Open('HDF5:"data/hdf5/complex.h5"://f16') cs = ds.GetRasterBand(1).Checksum() assert cs == 412, 'did not get expected checksum' def test_hdf5_single_char_varname(): ds = gdal.Open('HDF5:"data/hdf5/single_char_varname.h5"://e') assert ds is not None def test_hdf5_attr_all_datatypes(): ds = gdal.Open('data/hdf5/attr_all_datatypes.h5') assert ds is not None assert ds.GetMetadata() == {'attr_float16': '125 ', 'attr_float32': '125 ', 'attr_float64': '125 ', 'attr_int16': '125 ', 'attr_int32': '125 ', 'attr_int8': '125 ', 'attr_uint16': '125 ', 'attr_uint32': '125 ', 'attr_uint8': '125 '} def test_hdf5_virtual_file(): hdf5_files = [ 'hdf5/CSK_GEC.h5', 'hdf5/vlstr_metadata.h5', 'hdf5/groups.h5', 'hdf5/complex.h5', 'hdf5/single_char_varname.h5', 'hdf5/CSK_DGM.h5', 'hdf5/u8be.h5', 'hdf5/metadata.h5' ] for hdf5_file in hdf5_files: assert uffd_compare(hdf5_file) is True # FIXME: This FTP server seems to have disappeared. Replace with something else? hdf5_list = [ ('ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/samples/convert', 'C1979091.h5', 'HDF4_PALGROUP/HDF4_PALETTE_2', 7488, -1), ('ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/samples/convert', 'C1979091.h5', 'Raster_Image_#0', 3661, -1), ('ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf_files/hdf5/geospatial/DEM', 'half_moon_bay.grid', 'HDFEOS/GRIDS/DEMGRID/Data_Fields/Elevation', 30863, -1), ] @pytest.mark.parametrize( 'downloadURL,fileName,subdatasetname,checksum,download_size', hdf5_list, ids=['HDF5:"' + item[1] + '"://' + item[2] for item in hdf5_list], ) def test_hdf5(downloadURL, fileName, subdatasetname, checksum, download_size): if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): pytest.skip('no download') ds = gdal.Open('HDF5:"tmp/cache/' + fileName + '"://' + subdatasetname) assert ds.GetRasterBand(1).Checksum() == checksum, 'Bad checksum. Expected %d, got %d' % (checksum, ds.GetRasterBand(1).Checksum()) def test_hdf5_dimension_labels_with_null(): assert gdal.Open('data/hdf5/dimension_labels_with_null.h5') def test_hdf5_recursive_groups(): # File generated with # import h5py # f = h5py.File('hdf5/recursive_groups.h5','w') # group = f.create_group("subgroup") # group['link_to_root'] = f # group['link_to_self'] = group # group['soft_link_to_root'] = h5py.SoftLink('/') # group['soft_link_to_self'] = h5py.SoftLink('/subgroup') # group['soft_link_to_not_existing'] = h5py.SoftLink('/not_existing') # group['hard_link_to_root'] = h5py.HardLink('/') # group['ext_link_to_self_root'] = h5py.ExternalLink("hdf5/recursive_groups.h5", "/") # f.close() ds = gdal.Open('data/hdf5/recursive_groups.h5') assert ds is not None ds.GetSubDatasets() def test_hdf5_family_driver(): assert gdal.Open('data/hdf5/test_family_0.h5') def test_hdf5_single_dim(): ds = gdal.Open('HDF5:data/netcdf/byte_chunked_multiple.nc://x') assert ds b = ds.GetRasterBand(1) assert b.YSize == 1 assert b.XSize == 20 assert b.GetBlockSize() == [20, 1] assert b.Checksum() == 231 ############################################################################### # Test opening a file whose HDF5 signature is not at the beginning def test_hdf5_signature_not_at_beginning(): filename = '/vsimem/test.h5' gdal.FileFromMemBuffer(filename, open('data/netcdf/byte_hdf5_starting_at_offset_1024.nc', 'rb').read()) ds = gdal.Open(filename) assert ds is not None gdal.Unlink(filename) gdalautotest-3.2.2/gdrivers/__init__.py0000775000175000017500000000000014020414367016624 0ustar evenevengdalautotest-3.2.2/gdrivers/gribmultidim.py0000775000175000017500000001447514020414367017602 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: gribmultidim.py e6284bde94350861610502db9ebf3440c4c15051 2020-02-25 21:23:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test multidimensional support in GRIB driver # Author: Even Rouault # ############################################################################### # Copyright (c) 2019, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import pytest import struct pytestmark = pytest.mark.require_driver('GRIB') ############################################################################### def test_grib_multidim_grib2_3d_same_ref_time_different_forecast_time(): ds = gdal.OpenEx('data/grib/ds.mint.bin', gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert not rg.GetGroupNames() assert not rg.OpenGroup('non_existing') assert rg.GetMDArrayNames() == ['Y', 'X', 'TIME', 'MinT_0-SFC'] assert not rg.OpenMDArray('non_existing') dims = rg.GetDimensions() assert len(dims) == 3 ar = rg.OpenMDArray('MinT_0-SFC') assert ar attrs = ar.GetAttributes() assert len(attrs) == 13 assert ar.GetAttribute('name').Read() == 'MinT' assert ar.GetAttribute('long_name').Read() == 'Minimum temperature [C]' assert ar.GetAttribute('first_level').Read() == '0-SFC' assert ar.GetAttribute('discipline_code').Read() == 0 assert ar.GetAttribute('discipline_name').Read() == 'Meteorological' assert ar.GetAttribute('center_code').Read() == 8 assert ar.GetAttribute('center_name').Read() == 'US-NWSTG' assert ar.GetAttribute('signification_of_ref_time').Read() == 'Start of Forecast' assert ar.GetAttribute('reference_time_iso8601').Read() == '2008-02-21T17:00:00Z' assert ar.GetAttribute('production_status').Read() == 'Operational' assert ar.GetAttribute('type').Read() == 'Forecast' assert ar.GetAttribute('product_definition_template_number').Read() == 8 assert ar.GetAttribute('product_definition_numbers').Read() == ( 0, 5, 2, 0, 0, 255, 255, 1, 19, 1, 0, 0, 255, 4294967295, 2147483649, 2008, 2, 22, 12, 0, 0, 1, 0, 3, 255, 1, 12, 1, 0) dims = ar.GetDimensions() assert len(dims) == 3 assert dims[0].GetFullName() == '/TIME' assert dims[0].GetSize() == 2 assert struct.unpack('d' * 2, dims[0].GetIndexingVariable().Read()) == pytest.approx((1203681600.0, 1203768000.0)) assert dims[1].GetFullName() == '/Y' assert dims[1].GetSize() == 129 assert struct.unpack('d' * 129, dims[1].GetIndexingVariable().Read())[0:2] == pytest.approx((1784311.461394906, 1786811.461394906)) assert dims[2].GetFullName() == '/X' assert dims[2].GetSize() == 177 assert struct.unpack('d' * 177, dims[2].GetIndexingVariable().Read())[0:2] == pytest.approx((-7125887.299303299, -7123387.299303299)) assert ar.GetSpatialRef() assert ar.GetUnit() == 'C' assert ar.GetNoDataValueAsDouble() == 9999 data = ar.Read() assert len(data) == 2 * 129 * 177 * 8 data = struct.unpack('d' * 2 * 129 * 177, data) assert data[0] == 9999 assert data[20 * 177 + 20] == 24.950006103515648 data = ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert len(data) == 2 * 129 * 177 * 4 data = struct.unpack('f' * 2 * 129 * 177, data) assert data[0] == 9999 assert data[20 * 177 + 20] == struct.unpack('f', struct.pack('f', 24.950006103515648))[0] ############################################################################### def test_grib_multidim_grib1_2d(): ds = gdal.OpenEx('data/grib/Sample_QuikSCAT.grb', gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert not rg.GetGroupNames() assert not rg.OpenGroup('non_existing') assert rg.GetMDArrayNames() == ['Y', 'X', 'CRAIN_0-SFC', 'USCT_0-SFC', 'VSCT_0-SFC', 'TSEC_0-SFC'] dims = rg.GetDimensions() assert len(dims) == 2 ar = rg.OpenMDArray('CRAIN_0-SFC') assert ar dims = ar.GetDimensions() assert len(dims) == 2 assert dims[0].GetFullName() == '/Y' assert dims[0].GetSize() == 74 assert dims[1].GetFullName() == '/X' assert dims[1].GetSize() == 66 data = ar.Read() assert len(data) == 74 * 66 * 8 data = struct.unpack('d' * 74 * 66, data) assert data[0] == 0 assert data[20] == 9999 data = ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_Float32)) assert len(data) == 74 * 66 * 4 data = struct.unpack('f' * 74 * 66, data) assert data[0] == 0 assert data[20] == 9999 ############################################################################### # This file has different raster sizes for some of the products. def test_grib_multidim_different_sizes_messages(): ds = gdal.OpenEx('data/grib/bug3246.grb', gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert rg.GetMDArrayNames() == [ 'Y', 'X', 'UOGRD_1-SFC', 'VOGRD_1-SFC', 'Y2', 'X2', 'PRMSL_0-MSL', 'UGRD_10-HTGL', 'VGRD_10-HTGL', 'Y3', 'X3', 'HTSGW_1-SFC', 'WVPER_1-SFC', 'WVDIR_1-SFC', 'PERPW_1-SFC', 'DIRPW_1-SFC', 'PERSW_1-SFC', 'DIRSW_1-SFC'] dims = rg.GetDimensions() assert len(dims) == 6 gdalautotest-3.2.2/gdrivers/paux.py0000775000175000017500000000475214020414367016064 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: paux.py 5df6ce47d77b533f573b27ba4ddfaa881ab51b60 2020-05-10 21:00:08 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for PAux driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Read test of simple byte reference data. def test_paux_1(): tst = gdaltest.GDALTest('PAux', 'paux/small16.raw', 2, 12816) return tst.testOpen() ############################################################################### # Test copying. def test_paux_2(): tst = gdaltest.GDALTest('PAux', 'byte.tif', 1, 4672) return tst.testCreateCopy(check_gt=1) ############################################################################### # Test /vsimem based. def test_paux_3(): tst = gdaltest.GDALTest('PAux', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Cleanup. def test_paux_cleanup(): gdaltest.clean_tmp() gdal.Unlink('/vsimem/byte.tif.tst.aux.xml') gdalautotest-3.2.2/gdrivers/mff2.py0000775000175000017500000000353014020414367015732 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: mff2.py 7c3364fe681199f0746bb62bb09cbf8e0e130e0a 2020-05-10 15:49:12 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test MFF2 driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test reading a MFF2 file generated by CreateCopy() def test_mff2_1(): tst = gdaltest.GDALTest('MFF2', 'mff2/bytemff2', 1, 4672) return tst.testOpen() gdalautotest-3.2.2/gdrivers/kmlsuperoverlay.py0000775000175000017500000004144214020414367020350 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: kmlsuperoverlay.py 47a003fa24e5913eb1d8729edacfc07ceaeb9d46 2020-05-10 15:56:10 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test write functionality for KMLSUPEROVERLAY driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010-2014, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil from osgeo import gdal import gdaltest import pytest ############################################################################### # Test CreateCopy() to a KMZ file def test_kmlsuperoverlay_1(): tst = gdaltest.GDALTest('KMLSUPEROVERLAY', 'small_world.tif', 1, 30111, options=['FORMAT=PNG']) return tst.testCreateCopy(new_filename='/vsimem/kmlout.kmz') ############################################################################### # Test CreateCopy() to a KML file def test_kmlsuperoverlay_2(): tst = gdaltest.GDALTest('KMLSUPEROVERLAY', 'small_world.tif', 1, 30111, options=['FORMAT=PNG']) return tst.testCreateCopy(new_filename='/vsimem/kmlout.kml') ############################################################################### # Test CreateCopy() to a KML file def test_kmlsuperoverlay_3(): src_ds = gdal.Open('data/utm.tif') ds = gdal.GetDriverByName('KMLSUPEROVERLAY').CreateCopy('tmp/tmp.kml', src_ds) del ds src_ds = None f = gdal.VSIFOpenL('tmp/tmp.kml', 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '33.903' in data, data assert '33.625' in data, data assert '-117.309' in data, data assert '-117.639' in data, data filelist = ['tmp/0/0/0.jpg', 'tmp/0/0/0.kml', 'tmp/1/0/0.jpg', 'tmp/1/0/0.kml', 'tmp/1/0/1.jpg', 'tmp/1/0/1.kml', 'tmp/1/1/0.jpg', 'tmp/1/1/0.kml', 'tmp/1/1/1.jpg', 'tmp/1/1/1.kml', 'tmp/tmp.kml'] for filename in filelist: try: os.remove(filename) except OSError: pytest.fail("Missing file: %s" % filename) shutil.rmtree('tmp/0') shutil.rmtree('tmp/1') ############################################################################### # Test overviews def test_kmlsuperoverlay_4(): vrt_xml = """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 Area BAND Red data/small_world.tif 1 Green data/small_world.tif 2 Blue data/small_world.tif 3 """ gdal.FileFromMemBuffer("/vsimem/src.vrt", vrt_xml) src_ds = gdal.Open("/vsimem/src.vrt") ds = gdal.GetDriverByName('KMLSUPEROVERLAY').CreateCopy('/vsimem/kmlsuperoverlay_4.kmz', src_ds, options=['FORMAT=PNG', 'NAME=myname', 'DESCRIPTION=mydescription', 'ALTITUDE=10', 'ALTITUDEMODE=absolute']) assert ds.GetMetadataItem('NAME') == 'myname' assert ds.GetMetadataItem('DESCRIPTION') == 'mydescription' if ds.GetRasterBand(1).GetOverviewCount() != 1: ds = None src_ds = None gdal.Unlink("/vsimem/src.vrt") gdal.Unlink("/vsimem/kmlsuperoverlay_4.kmz") pytest.fail() if ds.GetRasterBand(1).GetOverview(0).Checksum() != 30111: ds = None src_ds = None gdal.Unlink("/vsimem/src.vrt") gdal.Unlink("/vsimem/kmlsuperoverlay_4.kmz") pytest.fail() if ds.GetRasterBand(1).Checksum() != src_ds.GetRasterBand(1).Checksum(): ds = None src_ds = None gdal.Unlink("/vsimem/src.vrt") gdal.Unlink("/vsimem/kmlsuperoverlay_4.kmz") pytest.fail() # Test fix for #6311 vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) got_data = vrt_ds.ReadRaster(0, 0, 800, 400, 200, 100) ref_data = ds.ReadRaster(0, 0, 800, 400, 200, 100) vrt_ds = None if got_data != ref_data: ds = None src_ds = None gdal.Unlink("/vsimem/src.vrt") gdal.Unlink("/vsimem/kmlsuperoverlay_4.kmz") pytest.fail() ds = None src_ds = None gdal.Unlink("/vsimem/src.vrt") gdal.Unlink("/vsimem/kmlsuperoverlay_4.kmz") ############################################################################### # Test that a raster which crosses the anti-meridian will be able to be displayed correctly (#4528) def test_kmlsuperoverlay_5(): try: from xml.etree import ElementTree except ImportError: pytest.skip() src_ds = gdal.Open(""" PROJCS["WGS 84 / Mercator 41", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4326"]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",100], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","3994"]] 8.8060000000000000e+06, 3.4960937500000000e+02, 0.0000000000000000e+00, -3.6200000000000000e+06, 0.0000000000000000e+00, -3.5937500000000000e+02 data/utm.tif 1 """) ds = gdal.GetDriverByName('KMLSUPEROVERLAY').CreateCopy('tmp/tmp.kml', src_ds, options=['FIX_ANTIMERIDIAN=YES']) del ds src_ds = None files = [ 'tmp/tmp.kml', 'tmp/0/0/0.kml', 'tmp/1/0/0.kml', 'tmp/1/0/1.kml', 'tmp/1/1/0.kml', 'tmp/1/1/1.kml', ] for f in files: res = ElementTree.parse(f) for tag in res.findall('.//{http://earth.google.com/kml/2.1}LatLonAltBox'): east = tag.find('{http://earth.google.com/kml/2.1}east').text west = tag.find('{http://earth.google.com/kml/2.1}west').text assert float(east) >= float(west), \ ('East is less than west in LatLonAltBox %s, (%s < %s)' % (f, east, west)) shutil.rmtree('tmp/0') shutil.rmtree('tmp/1') os.remove('tmp/tmp.kml') ############################################################################### # Test raster KML with alternate structure (such as http://opentopo.sdsc.edu/files/Haiti/NGA_Haiti_LiDAR2.kmz)) def test_kmlsuperoverlay_6(): ds = gdal.Open('data/kml/kmlimage.kmz') assert ds.GetProjectionRef().find('WGS_1984') >= 0 got_gt = ds.GetGeoTransform() ref_gt = [1.2554125761846773, 1.6640895429971981e-05, 0.0, 43.452120815728101, 0.0, -1.0762348187666334e-05] for i in range(6): assert got_gt[i] == pytest.approx(ref_gt[i], abs=1e-6) for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == 47673 assert ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == gdal.GCI_RedBand + i assert ds.GetRasterBand(1).GetOverviewCount() == 1 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 61070 ############################################################################### # Test raster KML with single Overlay (such as https://trac.osgeo.org/gdal/ticket/6712) def test_kmlsuperoverlay_7(): ds = gdal.Open('data/kml/small_world.kml') assert ds.GetProjectionRef().find('WGS_1984') >= 0 got_gt = ds.GetGeoTransform() ref_gt = [-180.0, 0.9, 0.0, 90.0, 0.0, -0.9] for i in range(6): assert got_gt[i] == pytest.approx(ref_gt[i], abs=1e-6) cs = ds.GetRasterBand(1).Checksum() assert cs == 30111 assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand ############################################################################### # Test raster KML with single Overlay (such as https://issues.qgis.org/issues/20173) def test_kmlsuperoverlay_single_overlay_document_folder_pct(): ds = gdal.Open('data/kml/small_world_in_document_folder_pct.kml') assert ds.GetProjectionRef().find('WGS_1984') >= 0 got_gt = ds.GetGeoTransform() ref_gt = [-180.0, 0.9, 0.0, 90.0, 0.0, -0.9] for i in range(6): assert got_gt[i] == pytest.approx(ref_gt[i], abs=1e-6) assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_PaletteIndex assert ds.GetRasterBand(1).GetColorTable() ############################################################################### # Test that a raster with lots of blank space doesn't have unnecessary child # KML/PNG files in transparent areas def test_kmlsuperoverlay_8(): # a large raster with actual data on each end and blank space in between src_ds = gdal.Open(""" GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]] 0, 0.01, 0, 0, 0, 0.01 Gray data/utm.tif 1 data/utm.tif 1 Gray data/utm.tif 1 data/utm.tif 1 Gray data/utm.tif 1 data/utm.tif 1 Alpha data/utm.tif 1 255 0 data/utm.tif 1 255 0 """) ds = gdal.GetDriverByName('KMLSUPEROVERLAY').CreateCopy('tmp/tmp.kml', src_ds, options=['FORMAT=AUTO']) del ds src_ds = None assert set(os.listdir('tmp/0/0')) == set(('0.kml', '0.png')) assert (set(os.listdir('tmp/3/1')) == set(('0.jpg', '0.kml', '1.jpg', '1.kml', '2.jpg', '2.kml', '3.jpg', '3.kml', '4.jpg', '4.kml', '5.jpg', '5.kml', '6.jpg', '6.kml', '7.jpg', '7.kml',))) assert set(os.listdir('tmp/3/2')) == set() shutil.rmtree('tmp/0') shutil.rmtree('tmp/1') shutil.rmtree('tmp/2') shutil.rmtree('tmp/3') os.remove('tmp/tmp.kml') ############################################################################### # Cleanup def test_kmlsuperoverlay_cleanup(): gdal.Unlink('/vsimem/0/0/0.png') gdal.Unlink('/vsimem/0/0/0.kml') gdal.Unlink('/vsimem/0/0') gdal.Unlink('/vsimem/0') gdal.Unlink('/vsimem/kmlout.kml') gdal.Unlink('/vsimem/kmlout.kmz') gdalautotest-3.2.2/gdrivers/iris.py0000775000175000017500000001101314020414367016041 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: iris.py 1b368ef645a88bedb913518a72e256479316e0a2 2020-05-10 17:39:16 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test IRIS driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2012-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Test reading a - fake - IRIS dataset def test_iris_1(): tst = gdaltest.GDALTest('IRIS', 'iris/fakeiris.dat', 1, 65532) return tst.testOpen() ############################################################################### # Test reading a real world IRIS dataset. def test_iris_2(): ds = gdal.Open('data/iris/iristest.dat') assert ds.GetRasterBand(1).Checksum() == 52872 ds.GetProjectionRef() # expected_wkt = """PROJCS["unnamed",GEOGCS["unnamed ellipse",DATUM["unknown",SPHEROID["unnamed",6371000.5,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0]]""" # got_srs = osr.SpatialReference(got_wkt) # expected_srs = osr.SpatialReference(expected_wkt) # There are some differences in the values of the parameters between Linux # and Windows not sure if it is only due to rounding differences, # different proj versions, etc... # if got_srs.IsSame(expected_srs) != 1: # gdaltest.post_reason('fail') # print('') # print(expected_wkt) # print(got_wkt) # return 'fail' got_gt = ds.GetGeoTransform() expected_gt = [16435.721785269096, 1370.4263720754534, 0.0, 5289830.4584420761, 0.0, -1357.6498705837876] for i in range(6): assert not ((expected_gt[i] == 0.0 and got_gt[i] != 0.0) or \ (expected_gt[i] != 0.0 and abs(got_gt[i] - expected_gt[i]) / abs(expected_gt[i]) > 1e-5)) expected_metadata = [ "AZIMUTH_SMOOTHING_FOR_SHEAR=0.0", "CAPPI_BOTTOM_HEIGHT=1000.0 m", "COMPOSITED_PRODUCT=YES", "COMPOSITED_PRODUCT_MASK=0x0000080c", "DATA_TYPE=Clutter Corrected H reflectivity (1 byte)", "DATA_TYPE_CODE=dBZ", "DATA_TYPE_INPUT=Clutter Corrected H reflectivity (1 byte)", "DATA_TYPE_INPUT_CODE=dBZ", "DATA_TYPE_UNITS=dBZ", "GROUND_HEIGHT=523 m", "INGEST_HARDWARE_NAME=composada ", "INGEST_SITE_IRIS_VERSION=8.12", "INGEST_SITE_NAME=composada ", "MAX_AGE_FOR_SHEAR_VVP_CORRECTION=600 s", "NYQUIST_VELOCITY=6.00 m/s", "PRF=450 Hz", "PRODUCT=CAPPI", "PRODUCT_CONFIGURATION_NAME=CAPPI250CAT ", "PRODUCT_ID=3", "PRODUCT_SITE_IRIS_VERSION=8.12", "PRODUCT_SITE_NAME=SMCXRADSRV01 ", "RADAR_HEIGHT=542 m", "TASK_NAME=PPIVOL_A ", "TIME_INPUT_INGEST_SWEEP=2012-04-19 14:48:05", "TIME_PRODUCT_GENERATED=2012-04-19 14:48:30", "WAVELENGTH=5.33 cm"] got_metadata = ds.GetMetadata() for md in expected_metadata: key = md[0:md.find('=')] value = md[md.find('=') + 1:] assert got_metadata[key] == value, ('did not find %s' % key) gdalautotest-3.2.2/gdrivers/tiledb_read.py0000775000175000017500000000340014020414367017332 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tiledb_read.py 7601a637dfd204948d00f4691c08f02eb7584de5 2019-04-12 04:29:21 -0500 Norman Barker $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for all datatypes from a TileDB array. # Author: TileDB, Inc # ############################################################################### # Copyright (c) 2019, TileDB, Inc # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest import gdaltest @pytest.mark.require_driver('TileDB') def test_tiledb_open(): ut = gdaltest.GDALTest('TileDB', 'tiledb_array', 1, 4857) ut.testOpen() gdalautotest-3.2.2/gdrivers/isg.py0000775000175000017500000000360214020414367015662 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: isg.py d6de69b3c6066fec6b3c5f15da5d93cb4a4bfc70 2020-05-10 16:33:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ISG support. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2019, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Perform simple read test. def test_isg_1(): tst = gdaltest.GDALTest('ISG', 'isg/test.isg', 1, 159) expected_gt = [120.0, 0.25, 0.0, 41.0, 0.0, -0.25] return tst.testOpen(check_gt=expected_gt) gdalautotest-3.2.2/gdrivers/mg4lidar.py0000775000175000017500000000636414020414367016613 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: mg4lidar.py 2da6e90962a140a55650fd7ccf263cbf84c52b9c 2019-08-07 14:31:52 +1200 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: MG4Lidar Reading Driver testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import gdaltest from osgeo import gdal import pytest ############################################################################### # Test reading a MG4Lidar file # def test_mg4lidar_1(): drv = gdal.GetDriverByName('MG4Lidar') if drv is None: pytest.skip() if not gdaltest.download_file('http://home.gdal.org/tmp/GDAL_MG4Lidar_Src.zip', 'GDAL_MG4Lidar_Src.zip'): pytest.skip() try: os.stat('tmp/cache/GDAL_MG4Lidar_Src') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/GDAL_MG4Lidar_Src.zip') try: os.stat('tmp/cache/GDAL_MG4Lidar_Src') except OSError: pytest.skip() except OSError: pytest.skip() ds = gdal.Open('tmp/cache/GDAL_MG4Lidar_Src/Tetons_200k.view') assert ds is not None, 'could not open dataset' prj = ds.GetProjectionRef() if prj.find('NAD83 / UTM zone 12N') == -1: gdaltest.post_reason('did not get expected projection') print(prj) return gt = ds.GetGeoTransform() ref_gt = (504489.919999999983702, 3.078227571115974, 0, 4795848.389999999664724, 0, -3.078259860787739) for i in range(6): assert gt[i] == pytest.approx(ref_gt[i], abs=1e-6), 'did not get expected geotransform' cs = ds.GetRasterBand(1).Checksum() if cs != 13216: gdaltest.post_reason('did not get expected checksum') print(cs) return cs = ds.GetRasterBand(1).GetOverview(0).Checksum() if cs != 64099: gdaltest.post_reason('did not get expected overview checksum') print(cs) return ds = None gdalautotest-3.2.2/gdrivers/tga.py0000664000175000017500000001631114020414367015651 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tga.py 40b7716873d49bc8686780dc1685bbfa42e23ece 2020-07-08 17:43:30 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test TGA driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2020, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest from osgeo import gdal pytestmark = pytest.mark.require_driver('TGA') def test_tga_read_rle_grey_level(): ds = gdal.Open('data/tga/ref_test_suite/cbw8.tga') assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.GetMetadataItem('AUTHOR_NAME') == 'Ricky True' assert ds.GetMetadataItem('COMMENTS') == 'Sample 8 bit run length compressed black and white image' assert ds.GetMetadataItem('IMAGE_ID') == 'Truevision(R) Sample Image' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).Checksum() == 43089 def test_tga_read_rle_color_table(): ds = gdal.Open('data/tga/ref_test_suite/ccm8.tga') assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.GetMetadataItem('AUTHOR_NAME') == 'Ricky True' assert ds.GetMetadataItem('COMMENTS') == 'Sample 8 bit run length compressed color mapped image' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ct = ds.GetRasterBand(1).GetColorTable() assert ct is not None assert ct.GetCount() == 256 assert ct.GetColorEntry(0) == (0, 0, 0, 255) assert ct.GetColorEntry(1) == (8, 8, 8, 255) assert ct.GetColorEntry(64) == (248, 0, 0, 255) assert ds.GetRasterBand(1).Checksum() == 38151 def test_tga_read_rle_24bit(): ds = gdal.Open('data/tga/ref_test_suite/ctc24.tga') assert ds.RasterCount == 3 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(1).Checksum() == 9797 assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).Checksum() == 9952 assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).Checksum() == 9848 def test_tga_read_uncompressed_grey_level(): ds = gdal.Open('data/tga/ref_test_suite/ubw8.tga') assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).Checksum() == 43089 def test_tga_read_uncompressed_color_table(): ds = gdal.Open('data/tga/ref_test_suite/ucm8.tga') assert ds.RasterCount == 1 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 ct = ds.GetRasterBand(1).GetColorTable() assert ct is not None assert ct.GetCount() == 256 assert ct.GetColorEntry(0) == (0, 0, 0, 255) assert ct.GetColorEntry(1) == (8, 8, 8, 255) assert ct.GetColorEntry(64) == (248, 0, 0, 255) assert ds.GetRasterBand(1).Checksum() == 38151 def test_tga_read_uncompressed_16bit(): ds = gdal.Open('data/tga/ref_test_suite/utc16.tga') assert ds.RasterCount == 3 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(1).Checksum() == 64747 assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).Checksum() == 64839 assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).Checksum() == 64796 def test_tga_read_uncompressed_24bit(): ds = gdal.Open('data/tga/ref_test_suite/utc24.tga') assert ds.RasterCount == 3 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(1).Checksum() == 9797 assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).Checksum() == 9952 assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).Checksum() == 9848 def test_tga_read_uncompressed_32bit(): ds = gdal.Open('data/tga/ref_test_suite/utc32.tga') assert ds.RasterCount == 4 assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(1).Checksum() == 9797 assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).Checksum() == 9952 assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).Checksum() == 9848 assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined assert ds.GetRasterBand(4).Checksum() == 0 def test_tga_read_uncompressed_32bit_alpha(): ds = gdal.Open('data/tga/stefan_full_rgba.tga') assert ds.RasterCount == 4 assert ds.RasterXSize == 162 assert ds.RasterYSize == 150 assert ds.GetRasterBand(1).GetColorTable() is None assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(1).Checksum() == 12603 assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).Checksum() == 58561 assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).Checksum() == 36064 assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(4).Checksum() == 10807 gdalautotest-3.2.2/gdrivers/dimap.py0000775000175000017500000001474514020414367016204 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: dimap.py 2da6e90962a140a55650fd7ccf263cbf84c52b9c 2019-08-07 14:31:52 +1200 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test SPOT DIMAP driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil from osgeo import gdal import pytest ############################################################################### # Open and verify a the GCPs and metadata. def test_dimap_1(): shutil.copy('data/dimap/METADATA.DIM', 'tmp') shutil.copy('data/dimap/IMAGERY.TIF', 'tmp') shutil.copy('data/rgbsmall.tif', 'tmp') ds = gdal.Open('tmp/METADATA.DIM') assert ds.RasterCount == 1 and ds.RasterXSize == 6000 and ds.RasterYSize == 6000, \ 'wrong size or bands' assert ds.GetRasterBand(1).Checksum(0, 0, 100, 100) == 21586, 'wrong checksum' md = ds.GetMetadata() assert md['PROCESSING_LEVEL'] == '1A', 'metadata wrong.' md = ds.GetMetadata() assert md['SPECTRAL_PHYSICAL_BIAS'] == '0.000000', 'metadata wrong.' gcp_srs = ds.GetGCPProjection() assert (not (gcp_srs[:6] != 'GEOGCS' \ or gcp_srs.find('WGS') == -1 \ or gcp_srs.find('84') == -1)), 'GCP Projection not retained.' gcps = ds.GetGCPs() assert len(gcps) == 4 and gcps[0].GCPPixel == 0.5 and gcps[0].GCPLine == 0.5 and gcps[0].GCPX == pytest.approx(4.3641728, abs=0.0000002) and gcps[0].GCPY == pytest.approx(44.2082255, abs=0.0000002) and gcps[0].GCPZ == pytest.approx(0, abs=0.0000002), \ 'GCPs wrong.' ds = None os.unlink('tmp/METADATA.DIM') os.unlink('tmp/IMAGERY.TIF') os.unlink('tmp/rgbsmall.tif') ############################################################################### # Open DIMAP 2 def test_dimap_2(): for name in ['data/dimap2', 'data/dimap2/VOL_PHR.XML', 'data/dimap2/DIM_foo.XML']: ds = gdal.Open(name) assert ds.RasterCount == 4 and ds.RasterXSize == 20 and ds.RasterYSize == 30, \ 'wrong size or bands' md = ds.GetMetadata() expected_md = {'GEOMETRIC_ATTITUDES_USED': 'ACCURATE', 'FACILITY_PROCESSING_CENTER': 'PROCESSING_CENTER', 'GEOMETRIC_VERTICAL_DESC': 'REFERENCE3D', 'EPHEMERIS_ACQUISITION_ORBIT_DIRECTION': 'DESCENDING', 'BAND_MODE': 'PX', 'EPHEMERIS_NADIR_LON': 'NADIR_LON', 'EPHEMERIS_ACQUISITION_ORBIT_NUMBER': 'ACQUISITION_ORBIT_NUMBER', 'SPECTRAL_PROCESSING': 'PMS', 'CLOUDCOVER_MEASURE_TYPE': 'AUTOMATIC', 'DATASET_JOB_ID': 'JOB_ID', 'MISSION': 'PHR', 'GEOMETRIC_GROUND_SETTING': 'true', 'GEOMETRIC_VERTICAL_SETTING': 'true', 'DATASET_PRODUCTION_DATE': 'PRODUCTION_DATE', 'DATASET_PRODUCER_CONTACT': 'PRODUCER_CONTACT', 'IMAGING_DATE': '2016-06-17', 'CLOUDCOVER_QUALITY_TABLES': 'PHR', 'DATASET_PRODUCER_NAME': 'PRODUCER_NAME', 'GEOMETRIC_GEOMETRIC_PROCESSING': 'SENSOR', 'GEOMETRIC_EPHEMERIS_USED': 'CORRECTED', 'GEOMETRIC_GROUND_DESC': 'R3D_ORTHO', 'DATASET_DELIVERY_TYPE': 'DELIVERY_TYPE', 'PROCESSING_LEVEL': 'SENSOR', 'DATASET_PRODUCER_ADDRESS': 'PRODUCER_ADDRESS', 'DATASET_PRODUCT_CODE': 'PRODUCT_CODE', 'INSTRUMENT_INDEX': '1A', 'EPHEMERIS_NADIR_LAT': 'NADIR_LAT', 'INSTRUMENT': 'PHR', 'CLOUDCOVER_MEASURE_NAME': 'Cloud_Cotation (CLD)', 'FACILITY_SOFTWARE': 'SOFTWARE', 'IMAGING_TIME': '12:34:56', 'MISSION_INDEX': '1A'} assert md == expected_md, 'metadata wrong.' rpc = ds.GetMetadata('RPC') expected_rpc = {'HEIGHT_OFF': 'HEIGHT_OFF', 'LINE_NUM_COEFF': ' LINE_NUM_COEFF_1 LINE_NUM_COEFF_2 LINE_NUM_COEFF_3 LINE_NUM_COEFF_4 LINE_NUM_COEFF_5 LINE_NUM_COEFF_6 LINE_NUM_COEFF_7 LINE_NUM_COEFF_8 LINE_NUM_COEFF_9 LINE_NUM_COEFF_10 LINE_NUM_COEFF_11 LINE_NUM_COEFF_12 LINE_NUM_COEFF_13 LINE_NUM_COEFF_14 LINE_NUM_COEFF_15 LINE_NUM_COEFF_16 LINE_NUM_COEFF_17 LINE_NUM_COEFF_18 LINE_NUM_COEFF_19 LINE_NUM_COEFF_20', 'LONG_OFF': 'LONG_OFF', 'SAMP_DEN_COEFF': ' SAMP_DEN_COEFF_1 SAMP_DEN_COEFF_2 SAMP_DEN_COEFF_3 SAMP_DEN_COEFF_4 SAMP_DEN_COEFF_5 SAMP_DEN_COEFF_6 SAMP_DEN_COEFF_7 SAMP_DEN_COEFF_8 SAMP_DEN_COEFF_9 SAMP_DEN_COEFF_10 SAMP_DEN_COEFF_11 SAMP_DEN_COEFF_12 SAMP_DEN_COEFF_13 SAMP_DEN_COEFF_14 SAMP_DEN_COEFF_15 SAMP_DEN_COEFF_16 SAMP_DEN_COEFF_17 SAMP_DEN_COEFF_18 SAMP_DEN_COEFF_19 SAMP_DEN_COEFF_20', 'LINE_SCALE': 'LINE_SCALE', 'SAMP_NUM_COEFF': ' SAMP_NUM_COEFF_1 SAMP_NUM_COEFF_2 SAMP_NUM_COEFF_3 SAMP_NUM_COEFF_4 SAMP_NUM_COEFF_5 SAMP_NUM_COEFF_6 SAMP_NUM_COEFF_7 SAMP_NUM_COEFF_8 SAMP_NUM_COEFF_9 SAMP_NUM_COEFF_10 SAMP_NUM_COEFF_11 SAMP_NUM_COEFF_12 SAMP_NUM_COEFF_13 SAMP_NUM_COEFF_14 SAMP_NUM_COEFF_15 SAMP_NUM_COEFF_16 SAMP_NUM_COEFF_17 SAMP_NUM_COEFF_18 SAMP_NUM_COEFF_19 SAMP_NUM_COEFF_20', 'LONG_SCALE': 'LONG_SCALE', 'SAMP_SCALE': 'SAMP_SCALE', 'SAMP_OFF': '4', 'LAT_SCALE': 'LAT_SCALE', 'LAT_OFF': 'LAT_OFF', 'LINE_OFF': '9', 'LINE_DEN_COEFF': ' LINE_DEN_COEFF_1 LINE_DEN_COEFF_2 LINE_DEN_COEFF_3 LINE_DEN_COEFF_4 LINE_DEN_COEFF_5 LINE_DEN_COEFF_6 LINE_DEN_COEFF_7 LINE_DEN_COEFF_8 LINE_DEN_COEFF_9 LINE_DEN_COEFF_10 LINE_DEN_COEFF_11 LINE_DEN_COEFF_12 LINE_DEN_COEFF_13 LINE_DEN_COEFF_14 LINE_DEN_COEFF_15 LINE_DEN_COEFF_16 LINE_DEN_COEFF_17 LINE_DEN_COEFF_18 LINE_DEN_COEFF_19 LINE_DEN_COEFF_20', 'HEIGHT_SCALE': 'HEIGHT_SCALE'} assert rpc == expected_rpc, 'RPC wrong.' cs = ds.GetRasterBand(1).Checksum() assert cs == 7024, 'wrong checksum.' ds = None gdalautotest-3.2.2/gdrivers/sigdem.py0000775000175000017500000000653114020414367016354 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: sigdem.py 2467022a103fc35fdb5be293312688d96df2badb 2020-05-10 17:54:37 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Scaled Integer Gridded Elevation Model support. # Author: Paul Austin # ############################################################################### # Copyright (c) 2018, Paul Austin # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Create simple copy and check. def test_sigdem_copy_check_prj(): tst = gdaltest.GDALTest('SIGDEM', 'byte.tif', 1, 4672) prj = 'PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) ############################################################################### # Verify writing files with non-square pixels. def test_sigdem_non_square(): tst = gdaltest.GDALTest('SIGDEM', 'sigdem/nonsquare_nad27_utm11.vrt', 1, 12481) prj = 'PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) ############################################################################### # Test creating an in memory copy. def test_sigdem_in_memory(): tst = gdaltest.GDALTest('SIGDEM', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### gdalautotest-3.2.2/gdrivers/ceos.py0000775000175000017500000000377414020414367016043 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ceos.py 38ede1291bf92865fa15237055cfb96d62606b89 2020-05-10 17:27:57 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test conventional CEOS driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # First 75K of an IRS (Indian Remote Sensing Satellite) LGSOWG scene. Only # contains 3 complete scanlines. Bizarre little endian CEOS variant. (#1862) def test_ceos_1(): tst = gdaltest.GDALTest('CEOS', 'ceos/IMAGERY-75K.L-3', 4, 9956, xoff=0, yoff=0, xsize=5932, ysize=3) return tst.testOpen() gdalautotest-3.2.2/gdrivers/fit.py0000775000175000017500000000424414020414367015665 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: fit.py b1c9c12ad373e40b955162b45d704070d4ebf7b0 2019-06-19 16:50:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for FIT driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest from osgeo import gdal @pytest.mark.parametrize('filename', [ 'byte', 'int16', 'uint16', 'int32', 'uint32', 'float32', 'float64' ]) def test_fit(filename): fitDriver = gdal.GetDriverByName('FIT') ds = gdal.Open('../gcore/data/' + filename + '.tif') fitDriver.CreateCopy('tmp/' + filename + '.fit', ds, options=['PAGESIZE=2,2']) ds2 = gdal.Open('tmp/' + filename + '.fit') assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() assert ds2.GetRasterBand(1).DataType == ds.GetRasterBand(1).DataType ds2 = None gdalautotest-3.2.2/gdrivers/jp2lura.py0000775000175000017500000022100314020414367016454 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: jp2lura.py b6c71e69565f9e1a99d8ad3a3c7ac8903904e49f 2020-10-09 14:54:43 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for JP2Lura driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2016, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import struct import sys import shutil from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest import gdaltest def jp2lura_available(): if gdal.GetConfigOption('LURA_LICENSE_NUM_1') is None or \ gdal.GetConfigOption('LURA_LICENSE_NUM_2') is None: return False gdaltest.deregister_all_jpeg2000_drivers_but('JP2Lura') ds = gdal.Open( os.path.join(os.path.dirname(__file__), 'data/jpeg2000/byte.jp2') ) gdaltest.reregister_all_jpeg2000_drivers() return ds is not None pytestmark = [ pytest.mark.require_driver('JP2Lura'), pytest.mark.skipif(not jp2lura_available(), reason='JP2Lura driver not available or missing license') ] ############################################################################### @pytest.fixture(autouse=True, scope='module') def startup_and_cleanup(): gdaltest.jp2lura_drv = gdal.GetDriverByName('JP2Lura') assert gdaltest.jp2lura_drv is not None gdaltest.deregister_all_jpeg2000_drivers_but('JP2Lura') yield gdaltest.reregister_all_jpeg2000_drivers() ############################################################################### # def test_jp2lura_missing_license_num(): old_num_1 = gdal.GetConfigOption('LURA_LICENSE_NUM_1') old_num_2 = gdal.GetConfigOption('LURA_LICENSE_NUM_2') gdal.SetConfigOption('LURA_LICENSE_NUM_1', '') gdal.SetConfigOption('LURA_LICENSE_NUM_2', '') with gdaltest.error_handler(): ds = gdal.Open('data/jpeg2000/byte.jp2') gdal.SetConfigOption('LURA_LICENSE_NUM_1', old_num_1) gdal.SetConfigOption('LURA_LICENSE_NUM_2', old_num_2) assert ds is None ############################################################################### # def test_jp2lura_invalid_license_num(): old_num_1 = gdal.GetConfigOption('LURA_LICENSE_NUM_1') old_num_2 = gdal.GetConfigOption('LURA_LICENSE_NUM_2') gdal.SetConfigOption('LURA_LICENSE_NUM_1', '1') gdal.SetConfigOption('LURA_LICENSE_NUM_2', '1') with gdaltest.error_handler(): ds = gdal.Open('data/jpeg2000/byte.jp2') gdal.SetConfigOption('LURA_LICENSE_NUM_1', old_num_1) gdal.SetConfigOption('LURA_LICENSE_NUM_2', old_num_2) assert ds is None ############################################################################### def validate(filename, expected_gmljp2=True, return_error_count=False, oidoc=None, inspire_tg=True): path = '../../gdal/swig/python/samples' if path not in sys.path: sys.path.append(path) try: import validate_jp2 except ImportError: pytest.skip('Cannot run validate_jp2') try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd') os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd') ogc_schemas_location = 'tmp/cache/SCHEMAS_OPENGIS_NET' except OSError: ogc_schemas_location = 'disabled' if ogc_schemas_location != 'disabled': try: import xmlvalidate xmlvalidate.validate # to make pyflakes happy except (ImportError, AttributeError): ogc_schemas_location = 'disabled' res = validate_jp2.validate(filename, oidoc, inspire_tg, expected_gmljp2, ogc_schemas_location) if return_error_count: return (res.error_count, res.warning_count) if res.error_count == 0 and res.warning_count == 0: return pytest.fail() ############################################################################### # Open byte.jp2 def test_jp2lura_2(): srs = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26711"]] """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('JP2Lura', 'jpeg2000/byte.jp2', 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Open int16.jp2 def test_jp2lura_3(): ds = gdal.Open('data/jpeg2000/int16.jp2') ds_ref = gdal.Open('data/int16.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Quite a bit of difference... assert maxdiff <= 6, 'Image too different from reference' ds = ogr.Open('data/jpeg2000/int16.jp2') assert ds is None ############################################################################### # Test copying byte.jp2 def test_jp2lura_4(out_filename='tmp/jp2lura_4.jp2'): src_ds = gdal.Open('data/jpeg2000/byte.jp2') src_wkt = src_ds.GetProjectionRef() src_gt = src_ds.GetGeoTransform() vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/jp2lura_4.vrt', src_ds) vrt_ds.SetMetadataItem('TIFFTAG_XRESOLUTION', '300') vrt_ds.SetMetadataItem('TIFFTAG_YRESOLUTION', '200') vrt_ds.SetMetadataItem('TIFFTAG_RESOLUTIONUNIT', '3 (pixels/cm)') gdal.Unlink(out_filename) out_ds = gdal.GetDriverByName('JP2Lura').CreateCopy(out_filename, vrt_ds, options=['REVERSIBLE=YES']) del out_ds vrt_ds = None gdal.Unlink('/vsimem/jp2lura_4.vrt') assert gdal.VSIStatL(out_filename + '.aux.xml') is None assert validate(out_filename, inspire_tg=False) != 'fail' ds = gdal.Open(out_filename) cs = ds.GetRasterBand(1).Checksum() got_wkt = ds.GetProjectionRef() got_gt = ds.GetGeoTransform() xres = ds.GetMetadataItem('TIFFTAG_XRESOLUTION') yres = ds.GetMetadataItem('TIFFTAG_YRESOLUTION') resunit = ds.GetMetadataItem('TIFFTAG_RESOLUTIONUNIT') ds = None gdal.Unlink(out_filename) assert xres == '300' and yres == '200' and resunit == '3 (pixels/cm)', \ 'bad resolution' sr1 = osr.SpatialReference() sr1.SetFromUserInput(got_wkt) sr2 = osr.SpatialReference() sr2.SetFromUserInput(src_wkt) if sr1.IsSame(sr2) == 0: print(got_wkt) print(src_wkt) pytest.fail('bad spatial reference') for i in range(6): assert got_gt[i] == pytest.approx(src_gt[i], abs=1e-8), 'bad geotransform' assert cs == 50054, 'bad checksum' def test_jp2lura_4_vsimem(): return test_jp2lura_4('/vsimem/jp2lura_4.jp2') ############################################################################### # Test copying int16.jp2 def test_jp2lura_5(): tst = gdaltest.GDALTest('JP2Lura', 'jpeg2000/int16.jp2', 1, None, options=['REVERSIBLE=YES', 'CODEC=J2K']) return tst.testCreateCopy() ############################################################################### # Test reading ll.jp2 def test_jp2lura_6(): tst = gdaltest.GDALTest('JP2Lura', 'jpeg2000/ll.jp2', 1, None) tst.testOpen() ds = gdal.Open('data/jpeg2000/ll.jp2') ds.GetRasterBand(1).Checksum() ds = None ############################################################################### # Open byte.jp2.gz (test use of the VSIL API) def test_jp2lura_7(): tst = gdaltest.GDALTest('JP2Lura', '/vsigzip/data/jpeg2000/byte.jp2.gz', 1, 50054, filename_absolute=1) ret = tst.testOpen() gdal.Unlink('data/jpeg2000/byte.jp2.gz.properties') return ret ############################################################################### # Test a JP2Lura with the 3 bands having 13bit depth and the 4th one 1 bit def test_jp2lura_8(): ds = gdal.Open('data/jpeg2000/3_13bit_and_1bit.jp2') expected_checksums = [64570, 57277, 56048] # 61292] for i, csum in enumerate(expected_checksums): assert ds.GetRasterBand(i + 1).Checksum() == csum, \ ('unexpected checksum (%d) for band %d' % (csum, i + 1)) assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, 'unexpected data type' ############################################################################### # Check that we can use .j2w world files (#4651) def test_jp2lura_9(): ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ 'geotransform differs from expected' ds = None ############################################################################### # Test YCBCR420 creation option def DISABLED_jp2lura_10(): src_ds = gdal.Open('data/rgbsmall.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_10.jp2', src_ds, options=['YCBCR420=YES', 'RESOLUTIONS=3']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) assert out_ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert out_ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert out_ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand del out_ds src_ds = None gdal.Unlink('/vsimem/jp2lura_10.jp2') # Quite a bit of difference... assert maxdiff <= 12, 'Image too different from reference' ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit def DISABLED_jp2lura_11(): ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) jp2_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/jp2lura_11.tif', ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) gtiff_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) # gtiff_fourth_band_subsampled_data = fourth_band.ReadRaster(0,0,ds.RasterXSize,ds.RasterYSize,ds.RasterXSize/16,ds.RasterYSize/16) tmp_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/jp2lura_11.tif') assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data assert jp2_fourth_band_data == gtiff_fourth_band_data ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ############################################################################### # Check that PAM overrides internal georeferencing (#5279) def test_jp2lura_12(): # Override projection shutil.copy('data/jpeg2000/byte.jp2', 'tmp/jp2lura_12.jp2') ds = gdal.Open('tmp/jp2lura_12.jp2') sr = osr.SpatialReference() sr.ImportFromEPSG(32631) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('tmp/jp2lura_12.jp2') wkt = ds.GetProjectionRef() ds = None gdaltest.jp2lura_drv.Delete('tmp/jp2lura_12.jp2') assert '32631' in wkt # Override geotransform shutil.copy('data/jpeg2000/byte.jp2', 'tmp/jp2lura_12.jp2') ds = gdal.Open('tmp/jp2lura_12.jp2') ds.SetGeoTransform([1000, 1, 0, 2000, 0, -1]) ds = None ds = gdal.Open('tmp/jp2lura_12.jp2') gt = ds.GetGeoTransform() ds = None gdaltest.jp2lura_drv.Delete('tmp/jp2lura_12.jp2') assert gt == (1000, 1, 0, 2000, 0, -1) ############################################################################### # Check that PAM overrides internal GCPs (#5279) def test_jp2lura_13(): # Create a dataset with GCPs src_ds = gdal.Open('data/rgb_gcp.vrt') ds = gdaltest.jp2lura_drv.CreateCopy('tmp/jp2lura_13.jp2', src_ds) ds = None src_ds = None assert gdal.VSIStatL('tmp/jp2lura_13.jp2.aux.xml') is None ds = gdal.Open('tmp/jp2lura_13.jp2') count = ds.GetGCPCount() gcps = ds.GetGCPs() wkt = ds.GetGCPProjection() assert count == 4 assert len(gcps) == 4 assert '4326' in wkt ds = None # Override GCP ds = gdal.Open('tmp/jp2lura_13.jp2') sr = osr.SpatialReference() sr.ImportFromEPSG(32631) gcps = [gdal.GCP(0, 1, 2, 3, 4)] ds.SetGCPs(gcps, sr.ExportToWkt()) ds = None ds = gdal.Open('tmp/jp2lura_13.jp2') count = ds.GetGCPCount() gcps = ds.GetGCPs() wkt = ds.GetGCPProjection() ds = None gdaltest.jp2lura_drv.Delete('tmp/jp2lura_13.jp2') assert count == 1 assert len(gcps) == 1 assert '32631' in wkt ############################################################################### # Check that we get GCPs even there's no projection info def test_jp2lura_14(): ds = gdal.Open('data/jpeg2000/byte_2gcps.jp2') assert ds.GetGCPCount() == 2 ############################################################################### # Test reading PixelIsPoint file (#5437) def test_jp2lura_16(): ds = gdal.Open('data/jpeg2000/byte_point.jp2') gt = ds.GetGeoTransform() assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', \ 'did not get AREA_OR_POINT = Point' ds = None gt_expected = (440690.0, 60.0, 0.0, 3751350.0, 0.0, -60.0) assert gt == gt_expected, 'did not get expected geotransform' gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') ds = gdal.Open('data/jpeg2000/byte_point.jp2') gt = ds.GetGeoTransform() ds = None gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) gt_expected = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) assert gt == gt_expected, \ 'did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE' ############################################################################### # Test writing PixelIsPoint file (#5437) def test_jp2lura_17(): src_ds = gdal.Open('data/jpeg2000/byte_point.jp2') ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_17.jp2', src_ds) ds = None src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_17.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_17.jp2') gt = ds.GetGeoTransform() assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', \ 'did not get AREA_OR_POINT = Point' ds = None gt_expected = (440690.0, 60.0, 0.0, 3751350.0, 0.0, -60.0) assert gt == gt_expected, 'did not get expected geotransform' gdal.Unlink('/vsimem/jp2lura_17.jp2') ############################################################################### # Test when using the decode_area API when one dimension of the dataset is not a # multiple of 1024 (#5480) def test_jp2lura_18(): src_ds = gdal.GetDriverByName('Mem').Create('', 2000, 2000) ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_18.jp2', src_ds, options=['TILEXSIZE=2000', 'TILEYSIZE=2000']) ds = None src_ds = None ds = gdal.Open('/vsimem/jp2lura_18.jp2') ds.GetRasterBand(1).Checksum() assert gdal.GetLastErrorMsg() == '' ds = None gdal.Unlink('/vsimem/jp2lura_18.jp2') ############################################################################### # Test reading file where GMLJP2 has nul character instead of \n (#5760) def test_jp2lura_19(): ds = gdal.Open('data/jpeg2000/byte_gmljp2_with_nul_car.jp2') assert ds.GetProjectionRef() != '' ds = None ############################################################################### # Validate GMLJP2 content against schema def test_jp2lura_20(): try: import xmlvalidate except ImportError: import traceback traceback.print_exc(file=sys.stdout) pytest.skip('Cannot import xmlvalidate') try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET.zip') except OSError: try: os.stat('../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip') shutil.copy('../ogr/tmp/cache/SCHEMAS_OPENGIS_NET.zip', 'tmp/cache') except OSError: url = 'http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip' if not gdaltest.download_file(url, 'SCHEMAS_OPENGIS_NET.zip', force_download=True, max_download_duration=20): pytest.skip('Cannot get SCHEMAS_OPENGIS_NET.zip') try: os.mkdir('tmp/cache/SCHEMAS_OPENGIS_NET') except OSError: pass try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/gml/3.1.1/profiles/gmlJP2Profile/1.0.0/gmlJP2Profile.xsd') except OSError: gdaltest.unzip('tmp/cache/SCHEMAS_OPENGIS_NET', 'tmp/cache/SCHEMAS_OPENGIS_NET.zip') try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xlink.xsd') except OSError: xlink_xsd_url = 'http://www.w3.org/1999/xlink.xsd' if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xlink.xsd', force_download=True, max_download_duration=10): xlink_xsd_url = 'http://even.rouault.free.fr/xlink.xsd' if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xlink.xsd', force_download=True, max_download_duration=10): pytest.skip('Cannot get xlink.xsd') try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/xml.xsd') except OSError: xlink_xsd_url = 'http://www.w3.org/1999/xml.xsd' if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xml.xsd', force_download=True, max_download_duration=10): xlink_xsd_url = 'http://even.rouault.free.fr/xml.xsd' if not gdaltest.download_file(xlink_xsd_url, 'SCHEMAS_OPENGIS_NET/xml.xsd', force_download=True, max_download_duration=10): pytest.skip('Cannot get xml.xsd') xmlvalidate.transform_abs_links_to_ref_links('tmp/cache/SCHEMAS_OPENGIS_NET') src_ds = gdal.Open('data/byte.tif') ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_20.jp2', src_ds) gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] ds = None gdal.Unlink('/vsimem/jp2lura_20.jp2') assert xmlvalidate.validate(gmljp2, ogc_schemas_location='tmp/cache/SCHEMAS_OPENGIS_NET') ############################################################################### # Test RGBA support def test_jp2lura_22(): # RGBA src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['REVERSIBLE=YES']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_22.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None assert validate('/vsimem/jp2lura_22.jp2', expected_gmljp2=False, inspire_tg=False) != 'fail' gdal.Unlink('/vsimem/jp2lura_22.jp2') assert maxdiff <= 0, 'Image too different from reference' if False: # pylint: disable=using-constant-test # RGBA with 1BIT_ALPHA=YES src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['1BIT_ALPHA=YES']) del out_ds src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None ds = gdal.OpenEx('/vsimem/jp2lura_22.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ds = None ds = gdal.Open('/vsimem/jp2lura_22.jp2') assert ds.GetRasterBand(4).Checksum() == 23120 ds = None gdal.Unlink('/vsimem/jp2lura_22.jp2') # RGBA with YCBCR420=YES src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['YCBCR420=YES']) del out_ds src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_22.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(1).Checksum() == 11457 ds = None gdal.Unlink('/vsimem/jp2lura_22.jp2') # RGBA with YCC=YES. Will emit a warning for now because of OpenJPEG # bug (only fixed in trunk, not released versions at that time) src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['YCC=YES', 'QUALITY=100', 'REVERSIBLE=YES']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None gdal.Unlink('/vsimem/jp2lura_22.jp2') assert maxdiff <= 0, 'Image too different from reference' # RGB,undefined src_ds = gdal.Open('../gcore/data/stefan_full_rgba_photometric_rgb.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_22.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined ds = None gdal.Unlink('/vsimem/jp2lura_22.jp2') assert maxdiff <= 0, 'Image too different from reference' # RGB,undefined with ALPHA=YES src_ds = gdal.Open('../gcore/data/stefan_full_rgba_photometric_rgb.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_22.jp2', src_ds, options=['QUALITY=100', 'REVERSIBLE=YES', 'ALPHA=YES']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_22.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_22.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None gdal.Unlink('/vsimem/jp2lura_22.jp2') assert maxdiff <= 0, 'Image too different from reference' ############################################################################### # Test NBITS support def DISABLED_jp2lura_23(): src_ds = gdal.Open('../gcore/data/uint16.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_23.jp2', src_ds, options=['NBITS=9', 'QUALITY=100', 'REVERSIBLE=YES']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None ds = gdal.Open('/vsimem/jp2lura_23.jp2') assert ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '9' out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_23_2.jp2', ds) assert out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '9' del out_ds ds = None assert gdal.VSIStatL('/vsimem/jp2lura_23.jp2.aux.xml') is None gdal.Unlink('/vsimem/jp2lura_23.jp2') gdal.Unlink('/vsimem/jp2lura_23_2.jp2') assert maxdiff <= 1, 'Image too different from reference' ############################################################################### # Test Grey+alpha support def test_jp2lura_24(): # Grey+alpha src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_24.jp2', src_ds, options=['REVERSIBLE=YES']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_24.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_24.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None assert validate('/vsimem/jp2lura_24.jp2', expected_gmljp2=False, inspire_tg=False) != 'fail' gdal.Unlink('/vsimem/jp2lura_24.jp2') assert maxdiff <= 0, 'Image too different from reference' if False: # pylint: disable=using-constant-test # Grey+alpha with 1BIT_ALPHA=YES src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_24.jp2', src_ds, options=['1BIT_ALPHA=YES']) src_ds = None assert gdal.VSIStatL('/vsimem/jp2lura_24.jp2.aux.xml') is None ds = gdal.OpenEx('/vsimem/jp2lura_24.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(2).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ds = None ds = gdal.Open('/vsimem/jp2lura_24.jp2') assert ds.GetRasterBand(2).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None assert ds.GetRasterBand(2).Checksum() == 23120 ds = None gdal.Unlink('/vsimem/jp2lura_24.jp2') ############################################################################### # Test multiband support def test_jp2lura_25(): src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 5) src_ds.GetRasterBand(1).Fill(255) src_ds.GetRasterBand(2).Fill(250) src_ds.GetRasterBand(3).Fill(245) src_ds.GetRasterBand(4).Fill(240) src_ds.GetRasterBand(5).Fill(235) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_25.jp2', src_ds, options=['REVERSIBLE=YES']) maxdiff = gdaltest.compare_ds(src_ds, out_ds) del out_ds src_ds = None ds = gdal.Open('/vsimem/jp2lura_25.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_Undefined ds = None assert gdal.VSIStatL('/vsimem/jp2lura_25.jp2.aux.xml') is None gdal.Unlink('/vsimem/jp2lura_25.jp2') assert maxdiff <= 0, 'Image too different from reference' ############################################################################### # Test CreateCopy() from a JPEG2000 with a 2048x2048 tiling def test_jp2lura_27(): # Test optimization in GDALCopyWholeRasterGetSwathSize() # Not sure how we can check that except looking at logs with CPL_DEBUG=GDAL # for "GDAL: GDALDatasetCopyWholeRaster(): 2048*2048 swaths, bInterleave=1" src_ds = gdal.GetDriverByName('MEM').Create('', 2049, 2049, 4) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_27.jp2', src_ds, options=['LEVELS=1', 'TILEXSIZE=2048', 'TILEYSIZE=2048']) src_ds = None # print('End of JP2 decoding') out2_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/jp2lura_27.tif', out_ds, options=['TILED=YES']) out_ds = None del out2_ds gdal.Unlink('/vsimem/jp2lura_27.jp2') gdal.Unlink('/vsimem/jp2lura_27.tif') ############################################################################### # Test CODEBLOCK_WIDTH/_HEIGHT XML_TYPE_IDX = 0 XML_VALUE_IDX = 1 XML_FIRST_CHILD_IDX = 2 def find_xml_node(ar, element_name, only_attributes=False): # type = ar[XML_TYPE_IDX] value = ar[XML_VALUE_IDX] if value == element_name: return ar for child_idx in range(XML_FIRST_CHILD_IDX, len(ar)): child = ar[child_idx] if only_attributes and child[XML_TYPE_IDX] != gdal.CXT_Attribute: continue found = find_xml_node(child, element_name) if found is not None: return found return None def get_attribute_val(ar, attr_name): node = find_xml_node(ar, attr_name, True) if node is None or node[XML_TYPE_IDX] != gdal.CXT_Attribute: return None if len(ar) > XML_FIRST_CHILD_IDX and \ node[XML_FIRST_CHILD_IDX][XML_TYPE_IDX] == gdal.CXT_Text: return node[XML_FIRST_CHILD_IDX][XML_VALUE_IDX] return None def find_element_with_name(ar, element_name, name): typ = ar[XML_TYPE_IDX] value = ar[XML_VALUE_IDX] if typ == gdal.CXT_Element and value == element_name and get_attribute_val(ar, 'name') == name: return ar for child_idx in range(XML_FIRST_CHILD_IDX, len(ar)): child = ar[child_idx] found = find_element_with_name(child, element_name, name) if found: return found return None def get_element_val(node): if node is None: return None for child_idx in range(XML_FIRST_CHILD_IDX, len(node)): child = node[child_idx] if child[XML_TYPE_IDX] == gdal.CXT_Text: return child[XML_VALUE_IDX] return None def jp2lura_test_codeblock(filename, codeblock_width, codeblock_height): node = gdal.GetJPEG2000Structure(filename, ['ALL=YES']) xcb = 2**(2 + int(get_element_val(find_element_with_name(node, "Field", "SPcod_xcb_minus_2")))) ycb = 2**(2 + int(get_element_val(find_element_with_name(node, "Field", "SPcod_ycb_minus_2")))) if xcb != codeblock_width or ycb != codeblock_height: return False return True def test_jp2lura_28(): src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) tests = [(['CODEBLOCK_WIDTH=2'], 64, 64, True), (['CODEBLOCK_WIDTH=2048'], 64, 64, True), (['CODEBLOCK_HEIGHT=2'], 64, 64, True), (['CODEBLOCK_HEIGHT=2048'], 64, 64, True), (['CODEBLOCK_WIDTH=128', 'CODEBLOCK_HEIGHT=128'], 64, 64, True), (['CODEBLOCK_WIDTH=63'], 32, 64, True), (['CODEBLOCK_WIDTH=32', 'CODEBLOCK_HEIGHT=32'], 32, 32, False), ] for (options, expected_cbkw, expected_cbkh, warning_expected) in tests: gdal.ErrorReset() gdal.PushErrorHandler() out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_28.jp2', src_ds, options=options) gdal.PopErrorHandler() if warning_expected and gdal.GetLastErrorMsg() == '': print(options) pytest.fail('warning expected') del out_ds if not jp2lura_test_codeblock('/vsimem/jp2lura_28.jp2', expected_cbkw, expected_cbkh): print(options) pytest.fail('unexpected codeblock size') gdal.Unlink('/vsimem/jp2lura_28.jp2') ############################################################################### # Test color table support def test_jp2lura_30(): src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ct.SetColorEntry(1, (255, 255, 0, 255)) ct.SetColorEntry(2, (255, 0, 255, 255)) ct.SetColorEntry(3, (0, 255, 255, 255)) src_ds.GetRasterBand(1).SetRasterColorTable(ct) gdal.ErrorReset() gdal.PushErrorHandler() out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_30.jp2', src_ds) gdal.PopErrorHandler() assert out_ds is None ############################################################################### # Test unusual band color interpretation order def DISABLED_jp2lura_31(): src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 3) src_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_GreenBand) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_BlueBand) src_ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_RedBand) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_31.jp2', src_ds) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_31.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_31.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_RedBand ds = None gdal.Unlink('/vsimem/jp2lura_31.jp2') # With alpha now src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 4) src_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_AlphaBand) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) src_ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_BlueBand) src_ds.GetRasterBand(4).SetColorInterpretation(gdal.GCI_RedBand) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_31.jp2', src_ds) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_31.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_31.jp2') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_RedBand ds = None gdal.Unlink('/vsimem/jp2lura_31.jp2') ############################################################################### # Test crazy tile size def DISABLED_jp2lura_33(): src_ds = gdal.Open(""" """) gdal.PushErrorHandler() out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_33.jp2', src_ds, options=['BLOCKXSIZE=100000', 'BLOCKYSIZE=100000']) gdal.PopErrorHandler() assert out_ds is None out_ds = None gdal.Unlink('/vsimem/jp2lura_33.jp2') ############################################################################### # Test opening a file whose dimensions are > 2^31-1 def test_jp2lura_34(): gdal.PushErrorHandler() ds = gdal.Open('data/jpeg2000/dimensions_above_31bit.jp2') gdal.PopErrorHandler() assert ds is None ############################################################################### # Test opening a truncated file def test_jp2lura_35(): gdal.PushErrorHandler() ds = gdal.Open('data/jpeg2000/truncated.jp2') gdal.PopErrorHandler() assert ds is None ############################################################################### # Test we cannot create files with more than 16384 bands def test_jp2lura_36(): src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 16385) gdal.PushErrorHandler() out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_36.jp2', src_ds) gdal.PopErrorHandler() assert out_ds is None and gdal.VSIStatL('/vsimem/jp2lura_36.jp2') is None ############################################################################### # Test metadata reading & writing def test_jp2lura_37(): # No metadata src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=['WRITE_METADATA=YES']) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_37.jp2') assert ds.GetMetadata() == {} gdal.Unlink('/vsimem/jp2lura_37.jp2') # Simple metadata in main domain for options in [['WRITE_METADATA=YES']]: src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadataItem('FOO', 'BAR') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=options) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_37.jp2') assert ds.GetMetadata() == {'FOO': 'BAR'} ds = None gdal.Unlink('/vsimem/jp2lura_37.jp2') # Simple metadata in auxiliary domain src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadataItem('FOO', 'BAR', 'SOME_DOMAIN') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=['WRITE_METADATA=YES']) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_37.jp2') md = ds.GetMetadata('SOME_DOMAIN') assert md == {'FOO': 'BAR'} gdal.Unlink('/vsimem/jp2lura_37.jp2') # Simple metadata in auxiliary XML domain src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadata([''], 'xml:SOME_DOMAIN') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=['WRITE_METADATA=YES']) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_37.jp2') assert ds.GetMetadata('xml:SOME_DOMAIN')[0] == '\n' gdal.Unlink('/vsimem/jp2lura_37.jp2') # Special xml:BOX_ metadata domain for options in [['WRITE_METADATA=YES']]: src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadata([''], 'xml:BOX_1') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=options) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_37.jp2') assert ds.GetMetadata('xml:BOX_0')[0] == '' gdal.Unlink('/vsimem/jp2lura_37.jp2') # Special xml:XMP metadata domain for options in [['WRITE_METADATA=YES']]: src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadata([''], 'xml:XMP') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options=options) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_37.jp2') assert ds.GetMetadata('xml:XMP')[0] == '' ds = None gdal.Unlink('/vsimem/jp2lura_37.jp2') # Special xml:IPR metadata domain # for options in [ ['WRITE_METADATA=YES'] ]: # src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) # src_ds.SetMetadata( [ '' ], 'xml:IPR') # out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_37.jp2', src_ds, options = options) # del out_ds # if gdal.VSIStatL('/vsimem/jp2lura_37.jp2.aux.xml') is not None: # gdaltest.post_reason('fail') # return 'fail' # ds = gdal.Open('/vsimem/jp2lura_37.jp2') # if ds.GetMetadata('xml:IPR')[0] != '': # gdaltest.post_reason('fail') # return 'fail' # ds = None gdal.Unlink('/vsimem/jp2lura_37.jp2') ############################################################################### # Test non-EPSG SRS (so written with a GML dictionary) def test_jp2lura_38(): # No metadata src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) wkt = """PROJCS["UTM Zone 31, Northern Hemisphere",GEOGCS["unnamed ellipse",DATUM["unknown",SPHEROID["unnamed",100,1]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" src_ds.SetProjection(wkt) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_38.jp2', src_ds, options=['GeoJP2=NO']) assert out_ds.GetProjectionRef() == wkt crsdictionary = out_ds.GetMetadata_List("xml:CRSDictionary.gml")[0] out_ds = None gdal.Unlink('/vsimem/jp2lura_38.jp2') do_validate = False try: import xmlvalidate do_validate = True except ImportError: print('Cannot import xmlvalidate') try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') except OSError: do_validate = False if do_validate: assert xmlvalidate.validate(crsdictionary, ogc_schemas_location='tmp/cache/SCHEMAS_OPENGIS_NET') ############################################################################### # Test GMLJP2OVERRIDE configuration option and DGIWG GMLJP2 def test_jp2lura_39(): # No metadata src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) gdal.SetConfigOption('GMLJP2OVERRIDE', '/vsimem/override.gml') # This GML has srsName only on RectifiedGrid (taken from D.2.2.2 from DGIWG_Profile_of_JPEG2000_for_Georeferenced_Imagery.pdf) gdal.FileFromMemBuffer('/vsimem/override.gml', """ 0 0 4999 9999 X Y 19.1234567 37.1234567 0.0 0.00001234 -0.00001234 0.0 gmljp2://codestream/0 Record Interleaved """) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_39.jp2', src_ds, options=['GeoJP2=NO']) gdal.SetConfigOption('GMLJP2OVERRIDE', None) gdal.Unlink('/vsimem/override.gml') del out_ds ds = gdal.Open('/vsimem/jp2lura_39.jp2') assert ds.GetProjectionRef().find('4326') >= 0 ds = None gdal.Unlink('/vsimem/jp2lura_39.jp2') ############################################################################### # Test we can parse GMLJP2 v2.0 def test_jp2lura_40(): # No metadata src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) src_ds.SetGeoTransform([0, 60, 0, 0, 0, -60]) gdal.SetConfigOption('GMLJP2OVERRIDE', '/vsimem/override.gml') gdal.FileFromMemBuffer('/vsimem/override.gml', """ gmljp2://codestream inapplicable 0 0 19 19 Lat Long 48.95 2.05 0 0.1 -0.1 0 gmljp2://codestream inapplicable """) out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_40.jp2', src_ds, options=['GeoJP2=NO']) gdal.SetConfigOption('GMLJP2OVERRIDE', None) gdal.Unlink('/vsimem/override.gml') del out_ds ds = gdal.Open('/vsimem/jp2lura_40.jp2') assert ds.GetProjectionRef().find('4326') >= 0 got_gt = ds.GetGeoTransform() expected_gt = (2, 0.1, 0, 49, 0, -0.1) for i in range(6): assert got_gt[i] == pytest.approx(expected_gt[i], abs=1e-5) ds = None gdal.Unlink('/vsimem/jp2lura_40.jp2') ############################################################################### # Test USE_SRC_CODESTREAM=YES def test_jp2lura_41(): src_ds = gdal.Open('data/jpeg2000/byte.jp2') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_41.jp2', src_ds, options=['USE_SRC_CODESTREAM=YES', '@PROFILE=PROFILE_1', 'GEOJP2=NO', 'GMLJP2=NO']) assert src_ds.GetRasterBand(1).Checksum() == out_ds.GetRasterBand(1).Checksum() del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_41.jp2').size == 9923 gdal.Unlink('/vsimem/jp2lura_41.jp2') gdal.Unlink('/vsimem/jp2lura_41.jp2.aux.xml') # Warning if ignored option gdal.ErrorReset() gdal.PushErrorHandler() out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_41.jp2', src_ds, options=['USE_SRC_CODESTREAM=YES', 'QUALITY=1']) gdal.PopErrorHandler() del out_ds # if gdal.GetLastErrorMsg() == '': # gdaltest.post_reason('fail') # return 'fail' gdal.Unlink('/vsimem/jp2lura_41.jp2') gdal.Unlink('/vsimem/jp2lura_41.jp2.aux.xml') # Warning if source is not JPEG2000 src_ds = gdal.Open('data/byte.tif') gdal.ErrorReset() gdal.PushErrorHandler() out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_41.jp2', src_ds, options=['USE_SRC_CODESTREAM=YES']) gdal.PopErrorHandler() del out_ds assert gdal.GetLastErrorMsg() != '' gdal.Unlink('/vsimem/jp2lura_41.jp2') ############################################################################### # Get structure of a JPEG2000 file def test_jp2lura_43(): ret = gdal.GetJPEG2000StructureAsString('data/jpeg2000/byte.jp2', ['ALL=YES']) assert ret is not None ############################################################################### # Test GMLJP2v2 def test_jp2lura_45(): if gdal.GetDriverByName('GML') is None: pytest.skip() if gdal.GetDriverByName('KML') is None and gdal.GetDriverByName('LIBKML') is None: pytest.skip() # Test GMLJP2V2_DEF=YES src_ds = gdal.Open('data/byte.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_45.jp2', src_ds, options=['GMLJP2V2_DEF=YES']) assert out_ds.GetLayerCount() == 0 assert out_ds.GetLayer(0) is None del out_ds ds = gdal.Open('/vsimem/jp2lura_45.jp2') gmljp2 = ds.GetMetadata_List("xml:gml.root-instance")[0] minimal_instance = """ inapplicable 440720 3750120 441920 3751320 0 0 19 19 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 inapplicable """ assert gmljp2 == minimal_instance gdal.Unlink('/vsimem/jp2lura_45.jp2') ############################################################################### # Test writing & reading RPC in GeoJP2 box def test_jp2lura_47(): src_ds = gdal.Open('../gcore/data/byte_rpc.tif') out_ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_47.jp2', src_ds) del out_ds assert gdal.VSIStatL('/vsimem/jp2lura_47.jp2.aux.xml') is None ds = gdal.Open('/vsimem/jp2lura_47.jp2') assert ds.GetMetadata('RPC') is not None ds = None gdal.Unlink('/vsimem/jp2lura_47.jp2') ############################################################################### # Test reading a dataset whose tile dimensions are larger than dataset ones def test_jp2lura_48(): ds = gdal.Open('data/jpeg2000/byte_tile_2048.jp2') (blockxsize, blockysize) = ds.GetRasterBand(1).GetBlockSize() assert (blockxsize, blockysize) == (20, 20) assert ds.GetRasterBand(1).Checksum() == 4610 ds = None ############################################################################### def test_jp2lura_online_1(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k', '7sisters200.j2k'): pytest.skip() # Checksum = 32669 on my PC tst = gdaltest.GDALTest('JP2Lura', 'tmp/cache/7sisters200.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/7sisters200.j2k') ds.GetRasterBand(1).Checksum() ds = None ############################################################################### def test_jp2lura_online_2(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2', 'gcp.jp2'): pytest.skip() # Checksum = 15621 on my PC tst = gdaltest.GDALTest('JP2Lura', 'tmp/cache/gcp.jp2', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/gcp.jp2') ds.GetRasterBand(1).Checksum() assert len(ds.GetGCPs()) == 15, 'bad number of GCP' expected_wkt = """GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]""" assert ds.GetGCPProjection() == expected_wkt, 'bad GCP projection' ds = None ############################################################################### def test_jp2lura_online_3(): if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.j2k', 'Bretagne1.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.bmp', 'Bretagne1.bmp'): pytest.skip() tst = gdaltest.GDALTest('JP2Lura', 'tmp/cache/Bretagne1.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/Bretagne1.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne1.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Difference between the image before and after compression assert maxdiff <= 17, 'Image too different from reference' ############################################################################### def test_jp2lura_online_4(): if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.j2k', 'Bretagne2.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.bmp', 'Bretagne2.bmp'): pytest.skip() tst = gdaltest.GDALTest('JP2Lura', 'tmp/cache/Bretagne2.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/Bretagne2.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne2.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref, 0, 0, 1024, 1024) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Difference between the image before and after compression assert maxdiff <= 10, 'Image too different from reference' ############################################################################### # Try reading JP2Lura with color table def test_jp2lura_online_5(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9.jp2', 'file9.jp2'): pytest.skip() ds = gdal.Open('tmp/cache/file9.jp2') cs1 = ds.GetRasterBand(1).Checksum() assert cs1 == 47664, 'Did not get expected checksums' assert ds.GetRasterBand(1).GetColorTable() is not None, \ 'Did not get expected color table' ds = None ############################################################################### # Try reading YCbCr JP2Lura as RGB def test_jp2lura_online_6(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_03/file3.jp2', 'file3.jp2'): pytest.skip() ds = gdal.Open('tmp/cache/file3.jp2') # cs1 = ds.GetRasterBand(1).Checksum() # cs2 = ds.GetRasterBand(2).Checksum() # cs3 = ds.GetRasterBand(3).Checksum() # if cs1 != 26140 or cs2 != 32689 or cs3 != 48247: # print(cs1, cs2, cs3) # gdaltest.post_reason('Did not get expected checksums') # return 'fail' assert ds is None ds = None ############################################################################### # Test GDAL_GEOREF_SOURCES def test_jp2lura_49(): tests = [(None, True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), (None, True, False, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), (None, False, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), (None, False, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('INTERNAL', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('INTERNAL,PAM', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), ('INTERNAL,WORLDFILE', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('INTERNAL,PAM,WORLDFILE', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), ('INTERNAL,WORLDFILE,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM,INTERNAL', False, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('PAM,WORLDFILE,INTERNAL', False, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('PAM', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), ('PAM,WORLDFILE', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), ('WORLDFILE', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,INTERNAL', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM,INTERNAL', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,INTERNAL,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('NONE', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ] for (config_option_value, copy_pam, copy_worldfile, expected_srs, expected_gt) in tests: gdal.SetConfigOption('GDAL_GEOREF_SOURCES', config_option_value) gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.jp2', open('data/jpeg2000/byte_nogeoref.jp2', 'rb').read()) if copy_pam: gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.jp2.aux.xml', open('data/jpeg2000/byte_nogeoref.jp2.aux.xml', 'rb').read()) if copy_worldfile: gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.j2w', open('data/jpeg2000/byte_nogeoref.j2w', 'rb').read()) ds = gdal.Open('/vsimem/byte_nogeoref.jp2') gt = ds.GetGeoTransform() srs_wkt = ds.GetProjectionRef() ds = None gdal.SetConfigOption('GDAL_GEOREF_SOURCES', None) gdal.Unlink('/vsimem/byte_nogeoref.jp2') gdal.Unlink('/vsimem/byte_nogeoref.jp2.aux.xml') gdal.Unlink('/vsimem/byte_nogeoref.j2w') if gt != expected_gt: print('Got ' + str(gt)) print('Expected ' + str(expected_gt)) pytest.fail('Did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) if expected_srs == 'LOCAL_CS["PAM"]' and srs_wkt == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]': pass # ok elif (expected_srs == '' and srs_wkt != '') or (expected_srs != '' and expected_srs not in srs_wkt): print('Got ' + srs_wkt) print('Expected ' + expected_srs) pytest.fail('Did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) tests = [(None, True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), (None, True, False, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), (None, False, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), (None, False, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('INTERNAL', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('INTERNAL,PAM', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('INTERNAL,WORLDFILE', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('INTERNAL,PAM,WORLDFILE', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('INTERNAL,WORLDFILE,PAM', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('WORLDFILE,PAM,INTERNAL', False, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('PAM,WORLDFILE,INTERNAL', False, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('GEOJP2', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('GEOJP2,GMLJP2', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('GMLJP2', True, True, '26712', (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0)), ('GMLJP2,GEOJP2', True, True, '26712', (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0)), ('MSIG', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('MSIG,GMLJP2,GEOJP2', True, True, '26712', (439970.0, 60.0, 0.0, 3751030.0, 0.0, -60.0)), ('MSIG,GEOJP2,GMLJP2', True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('PAM', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), ('PAM,WORLDFILE', True, True, 'LOCAL_CS["PAM"]', (100.0, 1.0, 0.0, 300.0, 0.0, -1.0)), ('WORLDFILE', True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,INTERNAL', True, True, '26711', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM,INTERNAL', True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,INTERNAL,PAM', True, True, '26711', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('NONE', True, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ] for (config_option_value, copy_pam, copy_worldfile, expected_srs, expected_gt) in tests: gdal.FileFromMemBuffer('/vsimem/inconsitant_geojp2_gmljp2.jp2', open('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', 'rb').read()) if copy_pam: gdal.FileFromMemBuffer('/vsimem/inconsitant_geojp2_gmljp2.jp2.aux.xml', open('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2.aux.xml', 'rb').read()) if copy_worldfile: gdal.FileFromMemBuffer('/vsimem/inconsitant_geojp2_gmljp2.j2w', open('data/jpeg2000/inconsitant_geojp2_gmljp2.j2w', 'rb').read()) open_options = [] if config_option_value is not None: open_options += ['GEOREF_SOURCES=' + config_option_value] ds = gdal.OpenEx('/vsimem/inconsitant_geojp2_gmljp2.jp2', open_options=open_options) gt = ds.GetGeoTransform() srs_wkt = ds.GetProjectionRef() ds = None gdal.Unlink('/vsimem/inconsitant_geojp2_gmljp2.jp2') gdal.Unlink('/vsimem/inconsitant_geojp2_gmljp2.jp2.aux.xml') gdal.Unlink('/vsimem/inconsitant_geojp2_gmljp2.j2w') if gt != expected_gt: print('Got ' + str(gt)) print('Expected ' + str(expected_gt)) pytest.fail('Did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) if expected_srs == 'LOCAL_CS["PAM"]' and srs_wkt == 'LOCAL_CS["PAM",UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]': pass # ok elif (expected_srs == '' and srs_wkt != '') or (expected_srs != '' and expected_srs not in srs_wkt): print('Got ' + srs_wkt) print('Expected ' + expected_srs) pytest.fail('Did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s' % (config_option_value, str(copy_pam), str(copy_worldfile))) ds = gdal.OpenEx('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', open_options=['GEOREF_SOURCES=PAM,WORLDFILE']) fl = ds.GetFileList() assert set(fl) == set(['data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', 'data/jpeg2000/inconsitant_geojp2_gmljp2.jp2.aux.xml']), \ 'Did not get expected filelist' gdal.ErrorReset() with gdaltest.error_handler(): gdal.OpenEx('data/jpeg2000/inconsitant_geojp2_gmljp2.jp2', open_options=['GEOREF_SOURCES=unhandled']) assert gdal.GetLastErrorMsg() != '', 'expected warning' ############################################################################### # Test reading split IEEE-754 Float32 def test_jp2lura_50(): tst = gdaltest.GDALTest('JP2Lura', 'jpeg2000/float32_ieee754_split_reversible.jp2', 1, 4672) return tst.testOpen() ############################################################################### # Test split IEEE-754 Float32 def test_jp2lura_51(): # Don't allow it by default src_ds = gdal.Open('data/float32.tif') with gdaltest.error_handler(): ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_51.jp2', src_ds) assert ds is None ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_51.jp2', src_ds, options=['SPLIT_IEEE754=YES']) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert validate('/vsimem/jp2lura_51.jp2', inspire_tg=False) != 'fail' gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_51.jp2') assert maxdiff <= 0.01 # QUALITY with gdaltest.error_handler(): ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_51.jp2', src_ds, options=['SPLIT_IEEE754=YES', 'QUALITY=100']) if ds is not None: maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 124 assert validate('/vsimem/jp2lura_51.jp2', inspire_tg=False) != 'fail' ds = None with gdaltest.error_handler(): gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_51.jp2') gdal.Unlink('/vsimem/jp2lura_51.jp2') # RATE ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_51.jp2', src_ds, options=['SPLIT_IEEE754=YES', 'RATE=1']) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 370 assert validate('/vsimem/jp2lura_51.jp2', inspire_tg=False) != 'fail' gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_51.jp2') # Test reversible ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_51.jp2', src_ds, options=['SPLIT_IEEE754=YES', 'REVERSIBLE=YES']) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff == 0.0 gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_51.jp2') ############################################################################### # Test other data types def test_jp2lura_52(): tests = [[-32768, gdal.GDT_Int16, 'h'], [-1, gdal.GDT_Int16, 'h'], [32767, gdal.GDT_Int16, 'h'], [0, gdal.GDT_UInt16, 'H'], [65535, gdal.GDT_UInt16, 'H'], [-2 ** 27, gdal.GDT_Int32, 'i'], [2 ** 27 - 1, gdal.GDT_Int32, 'i'], [0, gdal.GDT_UInt32, 'I'], [2 ** 28 - 1, gdal.GDT_UInt32, 'I'], ] for (val, dt, fmt) in tests: src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1, dt) src_ds.GetRasterBand(1).Fill(val) ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_52.jp2', src_ds, options=['REVERSIBLE=YES']) got_min, got_max = ds.GetRasterBand(1).ComputeRasterMinMax() assert val == got_min and val == got_max, (val, dt, fmt, got_min, got_max) ds = None assert not (val >= 0 and validate('/vsimem/jp2lura_52.jp2', expected_gmljp2=False, inspire_tg=False) == 'fail'), \ (val, dt, fmt) gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_52.jp2') ############################################################################### # Test RATE and QUALITY def test_jp2lura_53(): src_ds = gdal.Open('data/byte.tif') ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, options=['RATE=1']) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 8 gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, options=['QUALITY=100']) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 2 gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') # Forcing irreversible due to RATE ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, options=['REVERSIBLE=YES', 'RATE=1']) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 8 gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') # QUALITY ignored ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_53.jp2', src_ds, options=['REVERSIBLE=YES', 'QUALITY=100']) maxdiff = gdaltest.compare_ds(ds, src_ds) ds = None assert maxdiff <= 0 gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_53.jp2') ############################################################################### # Test RasterIO edge cases def test_jp2lura_54(): # Tiled with incomplete boundary tiles src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 1) src_ds.GetRasterBand(1).Fill(100) ds = gdaltest.jp2lura_drv.CreateCopy('/vsimem/jp2lura_54.jp2', src_ds, options=['REVERSIBLE=YES', 'TILEXSIZE=64', 'TILEYSIZE=64']) # Request with a type that is not the natural type data = ds.GetRasterBand(1).ReadRaster(0, 0, 100, 100, 100, 100, buf_type=gdal.GDT_Int16) data = struct.unpack('h' * 100 * 100, data) assert min(data) == 100 and max(data) == 100 # Request at a resolution that is not a power of two data = ds.GetRasterBand(1).ReadRaster(0, 0, 100, 100, 30, 30) data = struct.unpack('B' * 30 * 30, data) assert min(data) == 100 and max(data) == 100 ds = None gdaltest.jp2lura_drv.Delete('/vsimem/jp2lura_54.jp2') gdalautotest-3.2.2/gdrivers/nitf.py0000775000175000017500000047711214020414367016053 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: nitf.py 8b8483e5f7c29a563966ca6f92d871f508e5f6e0 2020-10-16 10:26:45 -0400 Matthew Baran $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for NITF driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import copy import os import sys import array import struct import shutil from osgeo import gdal from osgeo import osr import gdaltest import pytest @pytest.fixture(scope='module') def not_jpeg_9b(): import jpeg jpeg.test_jpeg_1() if gdaltest.jpeg_version == '9b': pytest.skip() def hex_string(s): return "".join(hex(ord(c))[2:] for c in s) ############################################################################### # Write/Read test of simple byte reference data. def test_nitf_1(): tst = gdaltest.GDALTest('NITF', 'byte.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Write/Read test of simple 16bit reference data. def test_nitf_2(): tst = gdaltest.GDALTest('NITF', 'int16.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Write/Read RGB image with lat/long georeferencing, and verify. def test_nitf_3(): tst = gdaltest.GDALTest('NITF', 'rgbsmall.tif', 3, 21349) return tst.testCreateCopy() ############################################################################### # Test direction creation of an NITF file. def nitf_create(creation_options, set_inverted_color_interp=True, createcopy=False): drv = gdal.GetDriverByName('NITF') try: os.remove('tmp/test_create.ntf') except OSError: pass if createcopy: ds = gdal.GetDriverByName('MEM').Create('', 200, 100, 3, gdal.GDT_Byte) else: ds = drv.Create('tmp/test_create.ntf', 200, 100, 3, gdal.GDT_Byte, creation_options) ds.SetGeoTransform((100, 0.1, 0.0, 30.0, 0.0, -0.1)) if set_inverted_color_interp: ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_BlueBand) ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetRasterColorInterpretation(gdal.GCI_RedBand) else: ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_RedBand) ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetRasterColorInterpretation(gdal.GCI_BlueBand) my_list = list(range(200)) + list(range(20, 220)) + list(range(30, 230)) try: raw_data = array.array('h', my_list).tobytes() except: # Python 2 raw_data = array.array('h', my_list).tostring() for line in range(100): ds.WriteRaster(0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1, 2, 3]) if createcopy: ds = drv.CreateCopy('tmp/test_create.ntf', ds, options=creation_options) ds = None ############################################################################### # Test direction creation of an non-compressed NITF file. def test_nitf_4(): return nitf_create(['ICORDS=G']) ############################################################################### # Verify created file def nitf_check_created_file(checksum1, checksum2, checksum3, set_inverted_color_interp=True): ds = gdal.Open('tmp/test_create.ntf') chksum = ds.GetRasterBand(1).Checksum() chksum_expect = checksum1 assert chksum == chksum_expect, 'Did not get expected chksum for band 1' chksum = ds.GetRasterBand(2).Checksum() chksum_expect = checksum2 assert chksum == chksum_expect, 'Did not get expected chksum for band 2' chksum = ds.GetRasterBand(3).Checksum() chksum_expect = checksum3 assert chksum == chksum_expect, 'Did not get expected chksum for band 3' geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(100, abs=0.1) and geotransform[1] == pytest.approx(0.1, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(30.0, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-0.1, abs=0.001), \ 'geotransform differs from expected' if set_inverted_color_interp: assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ 'Got wrong color interpretation.' assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ 'Got wrong color interpretation.' assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ 'Got wrong color interpretation.' ds = None ############################################################################### # Verify file created by nitf_4() def test_nitf_5(): return nitf_check_created_file(32498, 42602, 38982) ############################################################################### # Read existing NITF file. Verifies the new adjusted IGEOLO interp. def test_nitf_6(): tst = gdaltest.GDALTest('NITF', 'nitf/rgb.ntf', 3, 21349) return tst.testOpen(check_prj='WGS84', check_gt=(-44.842029478458, 0.003503401360, 0, -22.930748299319, 0, -0.003503401360)) ############################################################################### # NITF in-memory. def test_nitf_7(): tst = gdaltest.GDALTest('NITF', 'rgbsmall.tif', 3, 21349) return tst.testCreateCopy(vsimem=1) ############################################################################### # Verify we can open an NSIF file, and get metadata including BLOCKA. def test_nitf_8(): ds = gdal.Open('data/nitf/fake_nsif.ntf') chksum = ds.GetRasterBand(1).Checksum() chksum_expect = 12033 assert chksum == chksum_expect, 'Did not get expected chksum for band 1' md = ds.GetMetadata() assert md['NITF_FHDR'] == 'NSIF01.00', 'Got wrong FHDR value' assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+41.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+41.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+41.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+41.283881+020.074924', \ 'BLOCKA metadata has unexpected value.' ############################################################################### # Create and read a JPEG encoded NITF file. def test_nitf_9(): src_ds = gdal.Open('data/rgbsmall.tif') ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf9.ntf', src_ds, options=['IC=C3']) src_ds = None ds = None ds = gdal.Open('tmp/nitf9.ntf') (exp_mean, exp_stddev) = (65.9532, 46.9026375565) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ 'did not get expected mean or standard dev.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['COMPRESSION'] == 'JPEG', 'Did not get expected compression value.' ############################################################################### # For esoteric reasons, createcopy from jpeg compressed nitf files can be # tricky. Verify this is working. def test_nitf_10(): src_ds = gdal.Open('tmp/nitf9.ntf') expected_cs = src_ds.GetRasterBand(2).Checksum() src_ds = None assert expected_cs == 22296 or expected_cs == 22259 tst = gdaltest.GDALTest('NITF', '../tmp/nitf9.ntf', 2, expected_cs) return tst.testCreateCopy() ############################################################################### # Test 1bit file ... conveniently very small and easy to include! (#1854) def test_nitf_11(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/i_3034c.ntf tst = gdaltest.GDALTest('NITF', 'nitf/i_3034c.ntf', 1, 170) return tst.testOpen() ############################################################################### # Verify that TRE and CGM access via the metadata domain works. def test_nitf_12(): ds = gdal.Open('data/nitf/fake_nsif.ntf') mdTRE = ds.GetMetadata('TRE') try: # NG bindings blockA = ds.GetMetadataItem('BLOCKA', 'TRE') except: blockA = mdTRE['BLOCKA'] mdCGM = ds.GetMetadata('CGM') try: # NG bindings segmentCount = ds.GetMetadataItem('SEGMENT_COUNT', 'CGM') except: segmentCount = mdCGM['SEGMENT_COUNT'] ds = None expectedBlockA = '010000001000000000 +41.319331+020.078400+41.317083+020.126072+41.281634+020.122570+41.283881+020.074924 ' assert mdTRE['BLOCKA'] == expectedBlockA, \ 'did not find expected BLOCKA from metadata.' assert blockA == expectedBlockA, 'did not find expected BLOCKA from metadata item.' assert mdCGM['SEGMENT_COUNT'] == '0', \ 'did not find expected SEGMENT_COUNT from metadata.' assert segmentCount == '0', \ 'did not find expected SEGMENT_COUNT from metadata item.' ############################################################################### # Test creation of an NITF file in UTM Zone 11, Southern Hemisphere. def test_nitf_13(): drv = gdal.GetDriverByName('NITF') ds = drv.Create('tmp/test_13.ntf', 200, 100, 1, gdal.GDT_Byte, ['ICORDS=S']) ds.SetGeoTransform((400000, 10, 0.0, 6000000, 0.0, -10)) ds.SetProjection('PROJCS["UTM Zone 11, Southern Hemisphere",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000],UNIT["Meter",1]]') my_list = list(range(200)) try: raw_data = array.array('f', my_list).tobytes() except: # Python 2 raw_data = array.array('f', my_list).tostring() for line in range(100): ds.WriteRaster(0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) ds = None ############################################################################### # Verify previous file def test_nitf_14(): ds = gdal.Open('tmp/test_13.ntf') chksum = ds.GetRasterBand(1).Checksum() chksum_expect = 55964 assert chksum == chksum_expect, 'Did not get expected chksum for band 1' geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(400000, abs=.1) and geotransform[1] == pytest.approx(10, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(6000000, abs=.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-10, abs=0.001), \ 'geotransform differs from expected' prj = ds.GetProjectionRef() assert prj.find('PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000]') != -1, \ 'Coordinate system not UTM Zone 11, Southern Hemisphere' ds = None ############################################################################### # Test creating an in memory copy. def test_nitf_15(): tst = gdaltest.GDALTest('NITF', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Checks a 1-bit mono with mask table having (0x00) black as transparent with white arrow. def test_nitf_16(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3034d.nsf tst = gdaltest.GDALTest('NITF', 'nitf/ns3034d.nsf', 1, 170) return tst.testOpen() ############################################################################### # Checks a 1-bit RGB/LUT (green arrow) with a mask table (pad pixels having value of 0x00) # and a transparent pixel value of 1 being mapped to green by the LUT def test_nitf_17(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/i_3034f.ntf tst = gdaltest.GDALTest('NITF', 'nitf/i_3034f.ntf', 1, 170) return tst.testOpen() ############################################################################### # Test NITF file without image segment def test_nitf_18(): # Shut up the warning about missing image segment gdal.PushErrorHandler('CPLQuietErrorHandler') # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv1_1/U_0006A.NTF ds = gdal.Open("data/nitf/U_0006A.NTF") gdal.PopErrorHandler() assert ds.RasterCount == 0 ############################################################################### # Test BILEVEL (C1) decompression def test_nitf_19(): # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_0/U_1050A.NTF tst = gdaltest.GDALTest('NITF', 'nitf/U_1050A.NTF', 1, 65024) return tst.testOpen() ############################################################################### # Test NITF file consisting only of an header def test_nitf_20(): # Shut up the warning about file either corrupt or empty gdal.PushErrorHandler('CPLQuietErrorHandler') # From http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv1_1/U_0002A.NTF ds = gdal.Open("data/nitf/U_0002A.NTF") gdal.PopErrorHandler() assert ds is None ############################################################################### # Verify that TEXT access via the metadata domain works. # # See also nitf_35 for writing TEXT segments. def test_nitf_21(): # Shut up the warning about missing image segment gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/nitf/ns3114a.nsf') gdal.PopErrorHandler() mdTEXT = ds.GetMetadata('TEXT') try: # NG bindings data0 = ds.GetMetadataItem('DATA_0', 'TEXT') except: data0 = mdTEXT['DATA_0'] ds = None assert mdTEXT['DATA_0'] == 'A', 'did not find expected DATA_0 from metadata.' assert data0 == 'A', 'did not find expected DATA_0 from metadata item.' ############################################################################### # Write/Read test of simple int32 reference data. def test_nitf_22(): tst = gdaltest.GDALTest('NITF', '../../gcore/data/int32.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Write/Read test of simple float32 reference data. def test_nitf_23(): tst = gdaltest.GDALTest('NITF', '../../gcore/data/float32.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Write/Read test of simple float64 reference data. def test_nitf_24(): tst = gdaltest.GDALTest('NITF', '../../gcore/data/float64.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Write/Read test of simple uint16 reference data. def test_nitf_25(): tst = gdaltest.GDALTest('NITF', '../../gcore/data/uint16.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Write/Read test of simple uint32 reference data. def test_nitf_26(): tst = gdaltest.GDALTest('NITF', '../../gcore/data/uint32.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Test Create() with IC=NC compression, and multi-blocks def test_nitf_27(): nitf_create(['ICORDS=G', 'IC=NC', 'BLOCKXSIZE=10', 'BLOCKYSIZE=10']) return nitf_check_created_file(32498, 42602, 38982) ############################################################################### # Test Create() with IC=C8 compression with the JP2ECW driver def test_nitf_28_jp2ecw(): gdaltest.nitf_28_jp2ecw_is_ok = False if gdal.GetDriverByName('JP2ECW') is None: pytest.skip() import ecw if not ecw.has_write_support(): pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but('JP2ECW') if nitf_create(['ICORDS=G', 'IC=C8', 'TARGET=75'], set_inverted_color_interp=False) == 'success': ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) if ret == 'success': gdaltest.nitf_28_jp2ecw_is_ok = True else: ret = 'fail' tmpfilename = '/vsimem/nitf_28_jp2ecw.ntf' src_ds = gdal.GetDriverByName('MEM').Create('', 1025, 1025) gdal.GetDriverByName('NITF').CreateCopy(tmpfilename, src_ds, options=['IC=C8']) ds = gdal.Open(tmpfilename) blockxsize, blockysize = ds.GetRasterBand(1).GetBlockSize() ds = None gdal.Unlink(tmpfilename) if (blockxsize, blockysize) != (256, 256): # 256 since this is hardcoded as such in the ECW driver gdaltest.post_reason('wrong block size') print(blockxsize, blockysize) ret = 'fail' gdaltest.reregister_all_jpeg2000_drivers() return ret ############################################################################### # Test reading the previously create file with the JP2MrSID driver def test_nitf_28_jp2mrsid(): if not gdaltest.nitf_28_jp2ecw_is_ok: pytest.skip() jp2mrsid_drv = gdal.GetDriverByName('JP2MrSID') if jp2mrsid_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but('JP2MrSID') ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) gdaltest.reregister_all_jpeg2000_drivers() return ret ############################################################################### # Test reading the previously create file with the JP2KAK driver def test_nitf_28_jp2kak(): if not gdaltest.nitf_28_jp2ecw_is_ok: pytest.skip() jp2kak_drv = gdal.GetDriverByName('JP2KAK') if jp2kak_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but('JP2KAK') ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) gdaltest.reregister_all_jpeg2000_drivers() return ret ############################################################################### # Test reading the previously create file with the JP2KAK driver def test_nitf_28_jp2openjpeg(): if not gdaltest.nitf_28_jp2ecw_is_ok: pytest.skip() drv = gdal.GetDriverByName('JP2OpenJPEG') if drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but('JP2OpenJPEG') ret = nitf_check_created_file(32398, 42502, 38882, set_inverted_color_interp=False) gdaltest.reregister_all_jpeg2000_drivers() return ret ############################################################################### # Test Create() with IC=C8 compression with the JP2OpenJPEG driver def test_nitf_28_jp2openjpeg_bis(): drv = gdal.GetDriverByName('JP2OpenJPEG') if drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but('JP2OpenJPEG') if nitf_create(['ICORDS=G', 'IC=C8', 'QUALITY=25'], set_inverted_color_interp=False, createcopy=True) == 'success': ret = nitf_check_created_file(31604, 42782, 38791, set_inverted_color_interp=False) else: ret = 'fail' tmpfilename = '/vsimem/nitf_28_jp2openjpeg_bis.ntf' src_ds = gdal.GetDriverByName('MEM').Create('', 1025, 1025) gdal.GetDriverByName('NITF').CreateCopy(tmpfilename, src_ds, options=['IC=C8']) ds = gdal.Open(tmpfilename) blockxsize, blockysize = ds.GetRasterBand(1).GetBlockSize() ds = None gdal.Unlink(tmpfilename) if (blockxsize, blockysize) != (1024, 1024): gdaltest.post_reason('wrong block size') print(blockxsize, blockysize) ret = 'fail' gdaltest.reregister_all_jpeg2000_drivers() return ret ############################################################################### # Test Create() with a LUT def test_nitf_29(): drv = gdal.GetDriverByName('NITF') ds = drv.Create('tmp/test_29.ntf', 1, 1, 1, gdal.GDT_Byte, ['IREP=RGB/LUT', 'LUT_SIZE=128']) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ct.SetColorEntry(1, (255, 255, 0, 255)) ct.SetColorEntry(2, (255, 0, 255, 255)) ct.SetColorEntry(3, (0, 255, 255, 255)) ds.GetRasterBand(1).SetRasterColorTable(ct) ds = None ds = gdal.Open('tmp/test_29.ntf') ct = ds.GetRasterBand(1).GetRasterColorTable() assert (ct.GetCount() == 129 and \ ct.GetColorEntry(0) == (255, 255, 255, 255) and \ ct.GetColorEntry(1) == (255, 255, 0, 255) and \ ct.GetColorEntry(2) == (255, 0, 255, 255) and \ ct.GetColorEntry(3) == (0, 255, 255, 255)), 'Wrong color table entry.' new_ds = drv.CreateCopy('tmp/test_29_copy.ntf', ds) del new_ds ds = None ds = gdal.Open('tmp/test_29_copy.ntf') ct = ds.GetRasterBand(1).GetRasterColorTable() assert (ct.GetCount() == 130 and \ ct.GetColorEntry(0) == (255, 255, 255, 255) and \ ct.GetColorEntry(1) == (255, 255, 0, 255) and \ ct.GetColorEntry(2) == (255, 0, 255, 255) and \ ct.GetColorEntry(3) == (0, 255, 255, 255)), 'Wrong color table entry.' ds = None ############################################################################### # Verify we can write a file with BLOCKA TRE and read it back properly. def test_nitf_30(): src_ds = gdal.Open('data/nitf/fake_nsif.ntf') ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf30.ntf', src_ds) chksum = ds.GetRasterBand(1).Checksum() chksum_expect = 12033 assert chksum == chksum_expect, 'Did not get expected chksum for band 1' md = ds.GetMetadata() assert md['NITF_FHDR'] == 'NSIF01.00', 'Got wrong FHDR value' assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+41.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+41.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+41.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+41.283881+020.074924', \ 'BLOCKA metadata has unexpected value.' ds = None gdal.GetDriverByName('NITF').Delete('tmp/nitf30.ntf') # Test overriding src BLOCKA metadata with NITF_BLOCKA creation options gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf30_override.ntf', src_ds, options=['BLOCKA_BLOCK_INSTANCE_01=01', 'BLOCKA_BLOCK_COUNT=01', 'BLOCKA_N_GRAY_01=00000', 'BLOCKA_L_LINES_01=01000', 'BLOCKA_LAYOVER_ANGLE_01=000', 'BLOCKA_SHADOW_ANGLE_01=000', 'BLOCKA_FRLC_LOC_01=+42.319331+020.078400', 'BLOCKA_LRLC_LOC_01=+42.317083+020.126072', 'BLOCKA_LRFC_LOC_01=+42.281634+020.122570', 'BLOCKA_FRFC_LOC_01=+42.283881+020.074924' ]) ds = gdal.Open('/vsimem/nitf30_override.ntf') md = ds.GetMetadata() ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_override.ntf') assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+42.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+42.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+42.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+42.283881+020.074924', \ 'BLOCKA metadata has unexpected value.' # Test overriding src BLOCKA metadata with TRE=BLOCKA= creation option gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf30_override.ntf', src_ds, options=['TRE=BLOCKA=010000001000000000 +42.319331+020.078400+42.317083+020.126072+42.281634+020.122570+42.283881+020.074924xxxxx' ]) ds = gdal.Open('/vsimem/nitf30_override.ntf') md = ds.GetMetadata() ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_override.ntf') assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01' and md['NITF_BLOCKA_BLOCK_COUNT'] == '01' and md['NITF_BLOCKA_N_GRAY_01'] == '00000' and md['NITF_BLOCKA_L_LINES_01'] == '01000' and md['NITF_BLOCKA_LAYOVER_ANGLE_01'] == '000' and md['NITF_BLOCKA_SHADOW_ANGLE_01'] == '000' and md['NITF_BLOCKA_FRLC_LOC_01'] == '+42.319331+020.078400' and md['NITF_BLOCKA_LRLC_LOC_01'] == '+42.317083+020.126072' and md['NITF_BLOCKA_LRFC_LOC_01'] == '+42.281634+020.122570' and md['NITF_BLOCKA_FRFC_LOC_01'] == '+42.283881+020.074924', \ 'BLOCKA metadata has unexpected value.' # Test that gdal_translate -ullr doesn't propagate BLOCKA gdal.Translate('/vsimem/nitf30_no_src_md.ntf', src_ds, format='NITF', outputBounds=[2, 49, 3, 50]) ds = gdal.Open('/vsimem/nitf30_no_src_md.ntf') md = ds.GetMetadata() ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_no_src_md.ntf') assert 'NITF_BLOCKA_BLOCK_INSTANCE_01' not in md, \ 'unexpectdly found BLOCKA metadata.' # Test USE_SRC_NITF_METADATA=NO gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf30_no_src_md.ntf', src_ds, options=['USE_SRC_NITF_METADATA=NO']) ds = gdal.Open('/vsimem/nitf30_no_src_md.ntf') md = ds.GetMetadata() ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf30_no_src_md.ntf') assert 'NITF_BLOCKA_BLOCK_INSTANCE_01' not in md, \ 'unexpectdly found BLOCKA metadata.' ############################################################################### # Verify we can write a file with a custom TRE and read it back properly. def test_nitf_31(): nitf_create(['TRE=CUSTOM= Test TRE1\\0MORE', 'TRE=TOTEST=SecondTRE', 'ICORDS=G']) ds = gdal.Open('tmp/test_create.ntf') md = ds.GetMetadata('TRE') assert len(md) == 2, 'Did not get expected TRE count' # Check that the leading space in the CUSTOM metadata item is preserved (#3088, #3204) try: assert ds.GetMetadataItem('CUSTOM', 'TRE') == ' Test TRE1\\0MORE', \ 'Did not get expected TRE contents' except: pass assert md['CUSTOM'] == ' Test TRE1\\0MORE' and md['TOTEST'] == 'SecondTRE', \ 'Did not get expected TRE contents' ds = None return nitf_check_created_file(32498, 42602, 38982) ############################################################################### # Test Create() with ICORDS=D def test_nitf_32(): nitf_create(['ICORDS=D']) return nitf_check_created_file(32498, 42602, 38982) ############################################################################### # Test Create() with ICORDS=D and a consistent BLOCKA def test_nitf_33(): nitf_create(['ICORDS=D', 'BLOCKA_BLOCK_COUNT=01', 'BLOCKA_BLOCK_INSTANCE_01=01', 'BLOCKA_L_LINES_01=100', 'BLOCKA_FRLC_LOC_01=+29.950000+119.950000', 'BLOCKA_LRLC_LOC_01=+20.050000+119.950000', 'BLOCKA_LRFC_LOC_01=+20.050000+100.050000', 'BLOCKA_FRFC_LOC_01=+29.950000+100.050000']) return nitf_check_created_file(32498, 42602, 38982) ############################################################################### # Test CreateCopy() of a 16bit image with tiling def test_nitf_34(): tst = gdaltest.GDALTest('NITF', 'n43.dt0', 1, 49187, options=['BLOCKSIZE=64']) return tst.testCreateCopy() ############################################################################### # Test CreateCopy() writing file with a text segment. def test_nitf_35(): src_ds = gdal.Open('data/nitf/text_md.vrt') ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf_35.ntf', src_ds) src_ds = None ds = None ds = gdal.Open('tmp/nitf_35.ntf') exp_text = """This is text data with a newline.""" md = ds.GetMetadata('TEXT') assert md['DATA_0'] == exp_text, 'Did not get expected TEXT metadata.' exp_text = """Also, a second text segment is created.""" md = ds.GetMetadata('TEXT') assert md['DATA_1'] == exp_text, 'Did not get expected TEXT metadata.' ds = None gdal.GetDriverByName('NITF').Delete('tmp/nitf_35.ntf') ############################################################################### # Create and read a JPEG encoded NITF file (C3) with several blocks # Check that statistics are persisted (#3985) def test_nitf_36(): src_ds = gdal.Open('data/rgbsmall.tif') ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf36.ntf', src_ds, options=['IC=C3', 'BLOCKSIZE=32', 'QUALITY=100']) src_ds = None ds = None ds = gdal.Open('tmp/nitf36.ntf') assert ds.GetRasterBand(1).GetMinimum() is None, \ 'Did not expect to have minimum value at that point.' (_, _, mean, stddev) = ds.GetRasterBand(1).GetStatistics(False, False) assert stddev < 0, 'Did not expect to have statistics at that point.' (exp_mean, exp_stddev) = (65.4208, 47.254550335) (_, _, mean, stddev) = ds.GetRasterBand(1).GetStatistics(False, True) assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ 'did not get expected mean or standard dev.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['COMPRESSION'] == 'JPEG', 'Did not get expected compression value.' ds = None # Check that statistics are persisted (#3985) ds = gdal.Open('tmp/nitf36.ntf') assert ds.GetRasterBand(1).GetMinimum() is not None, \ 'Should have minimum value at that point.' (_, _, mean, stddev) = ds.GetRasterBand(1).GetStatistics(False, False) assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ 'Should have statistics at that point.' ds = None ############################################################################### # Create and read a NITF file with 69999 bands def test_nitf_37(): ds = gdal.GetDriverByName('NITF').Create('tmp/nitf37.ntf', 1, 1, 69999) ds = None ds = gdal.Open('tmp/nitf37.ntf') assert ds.RasterCount == 69999 ds = None ############################################################################### # Create and read a NITF file with 999 images def test_nitf_38(): ds = gdal.Open('data/byte.tif') nXSize = ds.RasterXSize nYSize = ds.RasterYSize data = ds.GetRasterBand(1).ReadRaster(0, 0, nXSize, nYSize) expected_cs = ds.GetRasterBand(1).Checksum() ds = gdal.GetDriverByName('NITF').Create('tmp/nitf38.ntf', nXSize, nYSize, 1, options=['NUMI=999']) ds = None ds = gdal.Open('NITF_IM:998:tmp/nitf38.ntf', gdal.GA_Update) ds.GetRasterBand(1).WriteRaster(0, 0, nXSize, nYSize, data) # Create overviews ds.BuildOverviews(overviewlist=[2]) ds = None ds = gdal.Open('NITF_IM:0:tmp/nitf38.ntf') assert ds.GetRasterBand(1).Checksum() == 0 ds = None ds = gdal.Open('NITF_IM:998:tmp/nitf38.ntf') cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs, 'bad checksum for image of 998th subdataset' # Check the overview cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087, 'bad checksum for overview of image of 998th subdataset' out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/nitf38.vrt', ds) out_ds = None ds = None ds = gdal.Open('tmp/nitf38.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('tmp/nitf38.vrt') assert cs == expected_cs ds = gdal.Open('NITF_IM:998:%s/tmp/nitf38.ntf' % os.getcwd()) out_ds = gdal.GetDriverByName('VRT').CreateCopy('%s/tmp/nitf38.vrt' % os.getcwd(), ds) out_ds = None ds = None ds = gdal.Open('tmp/nitf38.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('tmp/nitf38.vrt') assert cs == expected_cs ds = gdal.Open('NITF_IM:998:%s/tmp/nitf38.ntf' % os.getcwd()) out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/nitf38.vrt', ds) del out_ds ds = None ds = gdal.Open('tmp/nitf38.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('tmp/nitf38.vrt') assert cs == expected_cs ############################################################################### # Create and read a JPEG encoded NITF file (M3) with several blocks def test_nitf_39(): src_ds = gdal.Open('data/rgbsmall.tif') ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf39.ntf', src_ds, options=['IC=M3', 'BLOCKSIZE=32', 'QUALITY=100']) src_ds = None ds = None ds = gdal.Open('tmp/nitf39.ntf') (exp_mean, exp_stddev) = (65.4208, 47.254550335) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() assert exp_mean == pytest.approx(mean, abs=0.1) and exp_stddev == pytest.approx(stddev, abs=0.1), \ 'did not get expected mean or standard dev.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['COMPRESSION'] == 'JPEG', 'Did not get expected compression value.' ds = None ############################################################################### # Create a 10 GB NITF file def test_nitf_40(): # Determine if the filesystem supports sparse files (we don't want to create a real 10 GB # file ! if not gdaltest.filesystem_supports_sparse_files('tmp'): pytest.skip() width = 99000 height = 99000 x = width - 1 y = height - 1 ds = gdal.GetDriverByName('NITF').Create('tmp/nitf40.ntf', width, height, options=['BLOCKSIZE=256']) data = struct.pack('B' * 1, 123) # Write a non NULL byte at the bottom right corner of the image (around 10 GB offset) ds.GetRasterBand(1).WriteRaster(x, y, 1, 1, data) ds = None # Check that we can fetch it at the right value ds = gdal.Open('tmp/nitf40.ntf') assert ds.GetRasterBand(1).ReadRaster(x, y, 1, 1) == data ds = None # Check that it is indeed at a very far offset, and that the NITF driver # has not put it somewhere else due to involuntary cast to 32bit integer. blockWidth = 256 blockHeight = 256 nBlockx = int((width + blockWidth - 1) / blockWidth) iBlockx = int(x / blockWidth) iBlocky = int(y / blockHeight) ix = x % blockWidth iy = y % blockHeight offset = 843 + (iBlocky * nBlockx + iBlockx) * blockWidth * blockHeight + (iy * blockWidth + ix) try: os.SEEK_SET except AttributeError: os.SEEK_SET, os.SEEK_CUR, os.SEEK_END = list(range(3)) fd = open('tmp/nitf40.ntf', 'rb') fd.seek(offset, os.SEEK_SET) bytes_read = fd.read(1) fd.close() val = struct.unpack('B' * 1, bytes_read)[0] assert val == 123, ('Bad value at offset %d : %d' % (offset, val)) ############################################################################### # Check reading a 12-bit JPEG compressed NITF def test_nitf_41(not_jpeg_9b): # Check if JPEG driver supports 12bit JPEG reading/writing jpg_drv = gdal.GetDriverByName('JPEG') md = jpg_drv.GetMetadata() if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() gdal.Unlink('data/nitf/U_4017A.NTF.aux.xml') ds = gdal.Open('data/nitf/U_4017A.NTF') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 2385 and stats[2] <= 2386 ds = None gdal.Unlink('data/nitf/U_4017A.NTF.aux.xml') ############################################################################### # Check creating a 12-bit JPEG compressed NITF def test_nitf_42(not_jpeg_9b): # Check if JPEG driver supports 12bit JPEG reading/writing jpg_drv = gdal.GetDriverByName('JPEG') md = jpg_drv.GetMetadata() if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() ds = gdal.Open('data/nitf/U_4017A.NTF') out_ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf42.ntf', ds, options=['IC=C3', 'FHDR=NITF02.10']) del out_ds ds = gdal.Open('tmp/nitf42.ntf') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 2385 and stats[2] <= 2386 ds = None ############################################################################### # Test CreateCopy() in IC=C8 with various JPEG2000 drivers def nitf_43(driver_to_test, options): jp2_drv = gdal.GetDriverByName(driver_to_test) if driver_to_test == 'JP2ECW' and jp2_drv is not None: if 'DMD_CREATIONOPTIONLIST' not in jp2_drv.GetMetadata(): jp2_drv = None if jp2_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) ds = gdal.Open('data/byte.tif') gdal.PushErrorHandler('CPLQuietErrorHandler') out_ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf_43.ntf', ds, options=options, strict=0) gdal.PopErrorHandler() out_ds = None out_ds = gdal.Open('tmp/nitf_43.ntf') if out_ds.GetRasterBand(1).Checksum() == 4672: ret = 'success' else: ret = 'fail' out_ds = None if open('tmp/nitf_43.ntf', 'rb').read().decode('LATIN1').find('= 0: print('GMLJP2 detected !') ret = 'fail' gdal.GetDriverByName('NITF').Delete('tmp/nitf_43.ntf') gdaltest.reregister_all_jpeg2000_drivers() return ret def test_nitf_43_jasper(): return nitf_43('JPEG2000', ['IC=C8']) def test_nitf_43_jp2ecw(): import ecw if not ecw.has_write_support(): pytest.skip() return nitf_43('JP2ECW', ['IC=C8', 'TARGET=0']) def test_nitf_43_jp2kak(): return nitf_43('JP2KAK', ['IC=C8', 'QUALITY=100']) ############################################################################### # Check creating a monoblock 10000x1 image (ticket #3263) def test_nitf_44(): out_ds = gdal.GetDriverByName('NITF').Create('tmp/nitf44.ntf', 10000, 1) out_ds.GetRasterBand(1).Fill(255) out_ds = None ds = gdal.Open('tmp/nitf44.ntf') if 'GetBlockSize' in dir(gdal.Band): (blockx, _) = ds.GetRasterBand(1).GetBlockSize() assert blockx == 10000 assert ds.GetRasterBand(1).Checksum() == 57182 ds = None ############################################################################### # Check overviews on a JPEG compressed subdataset def test_nitf_45(): try: os.remove('tmp/nitf45.ntf.aux.xml') except OSError: pass shutil.copyfile('data/nitf/two_images_jpeg.ntf', 'tmp/nitf45.ntf') ds = gdal.Open('NITF_IM:1:tmp/nitf45.ntf', gdal.GA_Update) ds.BuildOverviews(overviewlist=[2]) # FIXME ? ds.GetRasterBand(1).GetOverview(0) is None until we reopen ds = None ds = gdal.Open('NITF_IM:1:tmp/nitf45.ntf') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1086, 'did not get expected checksum for overview of subdataset' ds = None ############################################################################### # Check overviews on a JPEG2000 compressed subdataset def nitf_46(driver_to_test): jp2_drv = gdal.GetDriverByName(driver_to_test) if jp2_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) try: os.remove('tmp/nitf46.ntf.aux.xml') except OSError: pass try: os.remove('tmp/nitf46.ntf_0.ovr') except OSError: pass shutil.copyfile('data/nitf/two_images_jp2.ntf', 'tmp/nitf46.ntf') ds = gdal.Open('NITF_IM:1:tmp/nitf46.ntf', gdal.GA_Update) ds.BuildOverviews(overviewlist=[2]) # FIXME ? ds.GetRasterBand(1).GetOverview(0) is None until we reopen ds = None ds = gdal.Open('NITF_IM:1:tmp/nitf46.ntf') if ds.GetRasterBand(1).GetOverview(0) is None: gdaltest.post_reason('no overview of subdataset') ret = 'fail' else: cs = ds.GetRasterBand(1).GetOverview(0).Checksum() if cs != 1086: print(cs) gdaltest.post_reason('did not get expected checksum for overview of subdataset') ret = 'fail' else: ret = 'success' ds = None gdaltest.reregister_all_jpeg2000_drivers() return ret def nitf_46_jp2ecw(): return nitf_46('JP2ECW') def nitf_46_jp2mrsid(): return nitf_46('JP2MrSID') def nitf_46_jp2kak(): return nitf_46('JP2KAK') def test_nitf_46_jasper(): return nitf_46('JPEG2000') def nitf_46_openjpeg(): return nitf_46('JP2OpenJPEG') ############################################################################### # Check reading of rsets. def test_nitf_47(): ds = gdal.Open('data/nitf/rset.ntf.r0') band = ds.GetRasterBand(2) assert band.GetOverviewCount() == 2, \ 'did not get the expected number of rset overviews.' cs = band.GetOverview(1).Checksum() assert cs == 1297, 'did not get expected checksum for overview of subdataset' ds = None ############################################################################### # Check building of standard overviews in place of rset overviews. def test_nitf_48(): try: os.remove('tmp/rset.ntf.r0') os.remove('tmp/rset.ntf.r1') os.remove('tmp/rset.ntf.r2') os.remove('tmp/rset.ntf.r0.ovr') except OSError: pass shutil.copyfile('data/nitf/rset.ntf.r0', 'tmp/rset.ntf.r0') shutil.copyfile('data/nitf/rset.ntf.r1', 'tmp/rset.ntf.r1') shutil.copyfile('data/nitf/rset.ntf.r2', 'tmp/rset.ntf.r2') ds = gdal.Open('tmp/rset.ntf.r0', gdal.GA_Update) ds.BuildOverviews(overviewlist=[3]) ds = None ds = gdal.Open('tmp/rset.ntf.r0') assert ds.GetRasterBand(1).GetOverviewCount() == 1, \ 'did not get the expected number of rset overviews.' cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 2328, 'did not get expected checksum for overview of subdataset' ds = None try: os.remove('tmp/rset.ntf.r0') os.remove('tmp/rset.ntf.r1') os.remove('tmp/rset.ntf.r2') os.remove('tmp/rset.ntf.r0.ovr') except OSError: pass ############################################################################### # Test TEXT and CGM creation options with CreateCopy() (#3376) def test_nitf_49(): options = ["TEXT=DATA_0=COUCOU", "TEXT=HEADER_0=ABC", # This content is invalid but who cares here "CGM=SEGMENT_COUNT=1", "CGM=SEGMENT_0_SLOC_ROW=25", "CGM=SEGMENT_0_SLOC_COL=25", "CGM=SEGMENT_0_SDLVL=2", "CGM=SEGMENT_0_SALVL=1", "CGM=SEGMENT_0_DATA=XYZ"] src_ds = gdal.Open('data/nitf/text_md.vrt') # This will check that the creation option overrides the TEXT metadata domain from the source ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf49.ntf', src_ds, options=options) # Test copy from source TEXT and CGM metadata domains ds2 = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf49_2.ntf', ds) md = ds2.GetMetadata('TEXT') if 'DATA_0' not in md or md['DATA_0'] != 'COUCOU' or \ 'HEADER_0' not in md or md['HEADER_0'].find('ABC ') == -1: gdaltest.post_reason('did not get expected TEXT metadata') print(md) return md = ds2.GetMetadata('CGM') if 'SEGMENT_COUNT' not in md or md['SEGMENT_COUNT'] != '1' or \ 'SEGMENT_0_DATA' not in md or md['SEGMENT_0_DATA'] != 'XYZ': gdaltest.post_reason('did not get expected CGM metadata') print(md) return src_ds = None ds = None ds2 = None ############################################################################### # Test TEXT and CGM creation options with Create() (#3376) def test_nitf_50(): options = [ # "IC=C8", "TEXT=DATA_0=COUCOU", "TEXT=HEADER_0=ABC", # This content is invalid but who cares here "CGM=SEGMENT_COUNT=1", "CGM=SEGMENT_0_SLOC_ROW=25", "CGM=SEGMENT_0_SLOC_COL=25", "CGM=SEGMENT_0_SDLVL=2", "CGM=SEGMENT_0_SALVL=1", "CGM=SEGMENT_0_DATA=XYZ"] try: os.remove('tmp/nitf50.ntf') except OSError: pass # This will check that the creation option overrides the TEXT metadata domain from the source ds = gdal.GetDriverByName('NITF').Create('tmp/nitf50.ntf', 100, 100, 3, options=options) ds.WriteRaster(0, 0, 100, 100, ' ', 1, 1, buf_type=gdal.GDT_Byte, band_list=[1, 2, 3]) ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_BlueBand) ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetRasterColorInterpretation(gdal.GCI_RedBand) # We need to reopen the dataset, because the TEXT and CGM segments are only written # when closing the dataset (for JP2 compressed datastreams, we need to wait for the # imagery to be written) ds = None ds = gdal.Open('tmp/nitf50.ntf') md = ds.GetMetadata('TEXT') if 'DATA_0' not in md or md['DATA_0'] != 'COUCOU' or \ 'HEADER_0' not in md or md['HEADER_0'].find('ABC ') == -1: gdaltest.post_reason('did not get expected TEXT metadata') print(md) return md = ds.GetMetadata('CGM') if 'SEGMENT_COUNT' not in md or md['SEGMENT_COUNT'] != '1' or \ 'SEGMENT_0_DATA' not in md or md['SEGMENT_0_DATA'] != 'XYZ': gdaltest.post_reason('did not get expected CGM metadata') print(md) return ds = None ############################################################################### # Test reading very small images with NBPP < 8 or NBPP == 12 def test_nitf_51(): for xsize in range(1, 9): for nbpp in [1, 2, 3, 4, 5, 6, 7, 12]: ds = gdal.GetDriverByName('NITF').Create('tmp/nitf51.ntf', xsize, 1) ds = None f = open('tmp/nitf51.ntf', 'rb+') # Patch NBPP value at offset 811 f.seek(811) f.write(struct.pack('B' * 2, 48 + int(nbpp / 10), 48 + nbpp % 10)) # Write image data f.seek(843) n = int((xsize * nbpp + 7) / 8) for i in range(n): f.write(struct.pack('B' * 1, 255)) f.close() ds = gdal.Open('tmp/nitf51.ntf') if nbpp == 12: data = ds.GetRasterBand(1).ReadRaster(0, 0, xsize, 1, buf_type=gdal.GDT_UInt16) arr = struct.unpack('H' * xsize, data) else: data = ds.GetRasterBand(1).ReadRaster(0, 0, xsize, 1) arr = struct.unpack('B' * xsize, data) ds = None for i in range(xsize): if arr[i] != (1 << nbpp) - 1: print('xsize = %d, nbpp = %d' % (xsize, nbpp)) pytest.fail('did not get expected data') ############################################################################### # Test reading GeoSDE TREs def test_nitf_52(): # Create a fake NITF file with GeoSDE TREs (probably not conformant, but enough to test GDAL code) ds = gdal.GetDriverByName('NITF').Create('tmp/nitf52.ntf', 1, 1, options=['FILE_TRE=GEOPSB=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345EURM ', 'FILE_TRE=PRJPSB=01234567890123456789012345678901234567890123456789012345678901234567890123456789AC0000000000000000000000000000000', 'TRE=MAPLOB=M 0001000010000000000100000000000005000000']) ds = None ds = gdal.Open('tmp/nitf52.ntf') wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None expected_wkt ="""PROJCS["unnamed",GEOGCS["EUROPEAN 1950, Mean (3 Param)",DATUM["EUROPEAN_1950_Mean_3_Param",SPHEROID["International 1924",6378388,297],TOWGS84[-87,-98,-121,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",0],PARAMETER["longitude_of_center",0],PARAMETER["standard_parallel_1",0],PARAMETER["standard_parallel_2",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" assert wkt in (expected_wkt, expected_wkt.replace('EUROPEAN_1950_Mean_3_Param', 'EUROPEAN 1950, Mean (3 Param)')) assert gt == (100000.0, 10.0, 0.0, 5000000.0, 0.0, -10.0), \ 'did not get expected geotransform' ############################################################################### # Test reading UTM MGRS def test_nitf_53(): ds = gdal.GetDriverByName('NITF').Create('tmp/nitf53.ntf', 2, 2, options=['ICORDS=N']) ds = None f = open('tmp/nitf53.ntf', 'rb+') # Patch ICORDS and IGEOLO f.seek(775) f.write(b'U') f.write(b'31UBQ1000040000') f.write(b'31UBQ2000040000') f.write(b'31UBQ2000030000') f.write(b'31UBQ1000030000') f.close() ds = gdal.Open('tmp/nitf53.ntf') wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None assert 'PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]' in wkt, \ 'did not get expected SRS' assert gt == (205000.0, 10000.0, 0.0, 5445000.0, 0.0, -10000.0), \ 'did not get expected geotransform' ############################################################################### # Test reading RPC00B def test_nitf_54(): # Create a fake NITF file with RPC00B TRE (probably not conformant, but enough to test GDAL code) RPC00B = '100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ds = gdal.GetDriverByName('NITF').Create('tmp/nitf54.ntf', 1, 1, options=['TRE=RPC00B=' + RPC00B]) ds = None ds = gdal.Open('tmp/nitf54.ntf') md = ds.GetMetadata('RPC') ds = None assert md is not None and 'HEIGHT_OFF' in md ############################################################################### # Test reading ICHIPB def test_nitf_55(): # Create a fake NITF file with ICHIPB TRE (probably not conformant, but enough to test GDAL code) ICHIPB = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ds = gdal.GetDriverByName('NITF').Create('tmp/nitf55.ntf', 1, 1, options=['TRE=ICHIPB=' + ICHIPB]) ds = None ds = gdal.Open('tmp/nitf55.ntf') md = ds.GetMetadata() ds = None assert md is not None and 'ICHIP_SCALE_FACTOR' in md ############################################################################### # Test reading USE00A def test_nitf_56(): # Create a fake NITF file with USE00A TRE (probably not conformant, but enough to test GDAL code) USE00A = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ds = gdal.GetDriverByName('NITF').Create('tmp/nitf56.ntf', 1, 1, options=['TRE=USE00A=' + USE00A]) ds = None ds = gdal.Open('tmp/nitf56.ntf') md = ds.GetMetadata() ds = None assert md is not None and 'NITF_USE00A_ANGLE_TO_NORTH' in md ############################################################################### # Test reading GEOLOB def test_nitf_57(): # Create a fake NITF file with GEOLOB TRE GEOLOB = '000000360000000360-180.000000000090.000000000000' ds = gdal.GetDriverByName('NITF').Create('tmp/nitf57.ntf', 1, 1, options=['TRE=GEOLOB=' + GEOLOB]) ds = None ds = gdal.Open('tmp/nitf57.ntf') gt = ds.GetGeoTransform() ds = None if gt != (-180.0, 1.0, 0.0, 90.0, 0.0, -1.0): gdaltest.post_reason('did not get expected geotransform') print(gt) return ############################################################################### # Test reading STDIDC def test_nitf_58(): # Create a fake NITF file with STDIDC TRE (probably not conformant, but enough to test GDAL code) STDIDC = '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ds = gdal.GetDriverByName('NITF').Create('tmp/nitf58.ntf', 1, 1, options=['TRE=STDIDC=' + STDIDC]) ds = None ds = gdal.Open('tmp/nitf58.ntf') md = ds.GetMetadata() ds = None assert md is not None and 'NITF_STDIDC_ACQUISITION_DATE' in md ############################################################################### # Test reading IMRFCA and IMASDA def test_nitf_read_IMRFCA_IMASDA(): # Create a fake NITF file with fake IMRFCA and IMASDA TRE IMRFCA = '0' * 1760 IMASDA = '0' * 242 tmpfile = '/vsimem/nitf_read_IMRFCA_IMASDA.ntf' gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA, 'TRE=IMASDA=' + IMASDA]) ds = gdal.Open(tmpfile) md = ds.GetMetadata('RPC') ds = None gdal.Unlink(tmpfile) assert not (md is None or md == {}) # Only IMRFCA gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA]) ds = gdal.Open(tmpfile) md = ds.GetMetadata('RPC') ds = None gdal.Unlink(tmpfile) assert md == {} # Only IMASDA gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMASDA=' + IMASDA]) ds = gdal.Open(tmpfile) md = ds.GetMetadata('RPC') ds = None gdal.Unlink(tmpfile) assert md == {} # Too short IMRFCA with gdaltest.error_handler(): gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA[0:-1], 'TRE=IMASDA=' + IMASDA]) ds = gdal.Open(tmpfile) md = ds.GetMetadata('RPC') ds = None gdal.Unlink(tmpfile) assert md == {} # Too short IMASDA with gdaltest.error_handler(): gdal.GetDriverByName('NITF').Create(tmpfile, 1, 1, options=['TRE=IMRFCA=' + IMRFCA, 'TRE=IMASDA=' + IMASDA[0:-1]]) ds = gdal.Open(tmpfile) md = ds.GetMetadata('RPC') ds = None gdal.Unlink(tmpfile) assert md == {} ############################################################################### # Test georeferencing through .nfw and .hdr files def test_nitf_59(): shutil.copyfile('data/nitf/nitf59.nfw', 'tmp/nitf59.nfw') shutil.copyfile('data/nitf/nitf59.hdr', 'tmp/nitf59.hdr') ds = gdal.GetDriverByName('NITF').Create('tmp/nitf59.ntf', 1, 1, options=['ICORDS=N']) ds = None ds = gdal.Open('tmp/nitf59.ntf') wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None assert """PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]""" in wkt, \ 'did not get expected SRS' assert gt == (149999.5, 1.0, 0.0, 4500000.5, 0.0, -1.0), \ 'did not get expected geotransform' ############################################################################### # Test reading CADRG polar tile georeferencing (#2940) def test_nitf_60(): # Shut down errors because the file is truncated gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/nitf/testtest.on9') gdal.PopErrorHandler() wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None assert wkt == """PROJCS["unknown",GEOGCS["unknown",DATUM["unknown",SPHEROID["unknown",6378137,0]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Azimuthal_Equidistant"],PARAMETER["latitude_of_center",90],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ 'did not get expected SRS' ref_gt = [1036422.8453166834, 149.94543479697344, 0.0, 345474.28177222813, 0.0, -149.94543479697404] for i in range(6): assert gt[i] == pytest.approx(ref_gt[i], abs=1e-6), 'did not get expected geotransform' ############################################################################### # Test reading TRE from DE segment def test_nitf_61(): # Derived from http://www.gwg.nga.mil/ntb/baseline/software/testfile/rsm/SampleFiles/FrameSet1/NITF_Files/i_6130a.zip # but hand edited to have just 1x1 imagery ds = gdal.Open('data/nitf/i_6130a_truncated.ntf') md = ds.GetMetadata('TRE') xml_tre = ds.GetMetadata('xml:TRE')[0] ds = None assert md is not None and 'RSMDCA' in md and 'RSMECA' in md and 'RSMPCA' in md and 'RSMIDA' in md assert xml_tre.find(' 8192 (#3922) def test_nitf_65(): ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_65.ntf', 10000, 100, options=['BLOCKXSIZE=10000']) ds = None ds = gdal.Open('/vsimem/nitf_65.ntf') (block_xsize, _) = ds.GetRasterBand(1).GetBlockSize() ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('/vsimem/nitf_65.ntf') assert block_xsize == 10000 ############################################################################### # Test creating an image with block_height = image_height > 8192 (#3922) def test_nitf_66(): ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_66.ntf', 100, 10000, options=['BLOCKYSIZE=10000', 'BLOCKXSIZE=50']) ds = None ds = gdal.Open('/vsimem/nitf_66.ntf') (_, block_ysize) = ds.GetRasterBand(1).GetBlockSize() ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('/vsimem/nitf_66.ntf') assert block_ysize == 10000 ############################################################################### # Test that we don't use scanline access in illegal cases (#3926) def test_nitf_67(): src_ds = gdal.Open('data/byte.tif') gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_67.ntf', src_ds, options=['BLOCKYSIZE=1', 'BLOCKXSIZE=10'], strict=0) gdal.PopErrorHandler() ds = None src_ds = None ds = gdal.Open('/vsimem/nitf_67.ntf') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('/vsimem/nitf_67.ntf') gdal.Unlink('/vsimem/nitf_67.ntf.aux.xml') assert cs == 4672 ############################################################################### # Test reading NITF_METADATA domain def test_nitf_68(): ds = gdal.Open('data/nitf/rgb.ntf') assert len(ds.GetMetadata('NITF_METADATA')) == 2 ds = None ds = gdal.Open('data/nitf/rgb.ntf') assert ds.GetMetadataItem('NITFFileHeader', 'NITF_METADATA') ds = None ############################################################################### # Test SetGCPs() support def test_nitf_69(): vrt_txt = """ data/byte.tif 1 """ # Test CreateCopy() vrt_ds = gdal.Open(vrt_txt) ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_69_src.ntf', vrt_ds) ds = None vrt_ds = None # Just in case gdal.Unlink('/vsimem/nitf_69_src.ntf.aux.xml') # Test Create() and SetGCPs() src_ds = gdal.Open('/vsimem/nitf_69_src.ntf') ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_69_dest.ntf', 20, 20, 1, options=['ICORDS=G']) ds.SetGCPs(src_ds.GetGCPs(), src_ds.GetGCPProjection()) ds.SetGCPs(src_ds.GetGCPs(), src_ds.GetGCPProjection()) # To check we can call it several times without error ds = None src_ds = None # Now open again ds = gdal.Open('/vsimem/nitf_69_dest.ntf') got_gcps = ds.GetGCPs() ds = None gdal.Unlink('/vsimem/nitf_69_src.ntf') gdal.Unlink('/vsimem/nitf_69_dest.ntf') # Check # Upper-left assert (got_gcps[0].GCPPixel == pytest.approx(0.5, abs=1e-5) and got_gcps[0].GCPLine == pytest.approx(0.5, abs=1e-5) and \ got_gcps[0].GCPX == pytest.approx(2, abs=1e-5) and got_gcps[0].GCPY == pytest.approx(49, abs=1e-5)), \ 'wrong gcp' # Upper-right assert (got_gcps[1].GCPPixel == pytest.approx(19.5, abs=1e-5) and got_gcps[1].GCPLine == pytest.approx(0.5, abs=1e-5) and \ got_gcps[1].GCPX == pytest.approx(3, abs=1e-5) and got_gcps[1].GCPY == pytest.approx(49.5, abs=1e-5)), \ 'wrong gcp' # Lower-right assert (got_gcps[2].GCPPixel == pytest.approx(19.5, abs=1e-5) and got_gcps[2].GCPLine == pytest.approx(19.5, abs=1e-5) and \ got_gcps[2].GCPX == pytest.approx(3, abs=1e-5) and got_gcps[2].GCPY == pytest.approx(48, abs=1e-5)), \ 'wrong gcp' # Lower-left assert (got_gcps[3].GCPPixel == pytest.approx(0.5, abs=1e-5) and got_gcps[3].GCPLine == pytest.approx(19.5, abs=1e-5) and \ got_gcps[3].GCPX == pytest.approx(2, abs=1e-5) and got_gcps[3].GCPY == pytest.approx(48, abs=1e-5)), \ 'wrong gcp' ############################################################################### # Create and read a JPEG encoded NITF file with NITF dimensions != JPEG dimensions def test_nitf_70(): src_ds = gdal.Open('data/rgbsmall.tif') ds = gdal.GetDriverByName('NITF').CreateCopy('tmp/nitf_70.ntf', src_ds, options=['IC=C3', 'BLOCKXSIZE=64', 'BLOCKYSIZE=64']) ds = None # For comparison ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/nitf_70.tif', src_ds, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'TILED=YES', 'BLOCKXSIZE=64', 'BLOCKYSIZE=64']) ds = None src_ds = None ds = gdal.Open('tmp/nitf_70.ntf') cs = ds.GetRasterBand(1).Checksum() ds = None ds = gdal.Open('tmp/nitf_70.tif') cs_ref = ds.GetRasterBand(1).Checksum() ds = None gdal.GetDriverByName('NITF').Delete('tmp/nitf_70.ntf') gdal.GetDriverByName('GTiff').Delete('tmp/nitf_70.tif') assert cs == cs_ref ############################################################################### # Test reading ENGRDA TRE (#6285) def test_nitf_71(): ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_71.ntf', 1, 1, options=['TRE=ENGRDA=0123456789012345678900210012345678901230123X01200000002XY01X01230123X01200000001X']) ds = None ds = gdal.Open('/vsimem/nitf_71.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_71.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test writing and reading RPC00B def compare_rpc(src_md, md): # Check that we got data with the expected precision for key in src_md: if key == 'ERR_BIAS' or key == 'ERR_RAND': continue assert key in md, ('fail: %s missing' % key) if 'COEFF' in key: expected = [float(v) for v in src_md[key].strip().split(' ')] found = [float(v) for v in md[key].strip().split(' ')] if expected != found: print(md) pytest.fail('fail: %s value is not the one expected' % key) elif float(src_md[key]) != float(md[key]): print(md) pytest.fail('fail: %s value is not the one expected' % key) def test_nitf_72(): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) # Use full precision src_md_max_precision = { 'ERR_BIAS': '1234.56', 'ERR_RAND': '2345.67', 'LINE_OFF': '345678', 'SAMP_OFF': '45678', 'LAT_OFF': '-89.8765', 'LONG_OFF': '-179.1234', 'HEIGHT_OFF': '-9876', 'LINE_SCALE': '987654', 'SAMP_SCALE': '67890', 'LAT_SCALE': '-12.3456', 'LONG_SCALE': '-123.4567', 'HEIGHT_SCALE': '-1234', 'LINE_NUM_COEFF': '0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', 'LINE_DEN_COEFF': '1 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', 'SAMP_NUM_COEFF': '2 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', 'SAMP_DEN_COEFF': '3 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', } src_md = src_md_max_precision src_ds.SetMetadata(src_md, 'RPC') gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) assert gdal.GetLastErrorMsg() == '', 'fail: did not expect warning' if gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None: f = gdal.VSIFOpenL('/vsimem/nitf_72.ntf.aux.xml', 'rb') data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(str(data)) pytest.fail('fail: PAM file not expected') ds = gdal.Open('/vsimem/nitf_72.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') compare_rpc(src_md, md) expected_RPC00B_max_precision = '11234.562345.6734567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' assert RPC00B == expected_RPC00B_max_precision, 'fail: did not get expected RPC00B' # Test without ERR_BIAS and ERR_RAND src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_md = copy.copy(src_md_max_precision) del src_md['ERR_BIAS'] del src_md['ERR_RAND'] src_ds.SetMetadata(src_md, 'RPC') gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) assert gdal.GetLastErrorMsg() == '', 'fail: did not expect warning' if gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None: f = gdal.VSIFOpenL('/vsimem/nitf_72.ntf.aux.xml', 'rb') data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(str(data)) pytest.fail('fail: PAM file not expected') ds = gdal.Open('/vsimem/nitf_72.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') ds = None expected_RPC00B = '10000.000000.0034567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' # Test that direct RPC00B copy works src_nitf_ds = gdal.Open('/vsimem/nitf_72.ntf') gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72_copy.ntf', src_nitf_ds) src_nitf_ds = None ds = gdal.Open('/vsimem/nitf_72_copy.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') ds = None assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72_copy.ntf') # Test that RPC00B = NO works gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds, options=['RPC00B=NO']) assert gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None, \ 'fail: PAM file was expected' ds = gdal.Open('/vsimem/nitf_72.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') assert RPC00B is None, 'fail: did not expect RPC00B' src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) # Test padding src_md = { 'ERR_BIAS': '123', 'ERR_RAND': '234', 'LINE_OFF': '3456', 'SAMP_OFF': '4567', 'LAT_OFF': '8', 'LONG_OFF': '17', 'HEIGHT_OFF': '987', 'LINE_SCALE': '98765', 'SAMP_SCALE': '6789', 'LAT_SCALE': '12', 'LONG_SCALE': '109', 'HEIGHT_SCALE': '34', 'LINE_NUM_COEFF': '0 9.87e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', 'LINE_DEN_COEFF': '1 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', 'SAMP_NUM_COEFF': '2 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', 'SAMP_DEN_COEFF': '3 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9', } src_ds.SetMetadata(src_md, 'RPC') gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) assert gdal.GetLastErrorMsg() == '', 'fail: did not expect warning' if gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None: f = gdal.VSIFOpenL('/vsimem/nitf_72.ntf.aux.xml', 'rb') data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(str(data)) pytest.fail('fail: PAM file not expected') ds = gdal.Open('/vsimem/nitf_72.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') compare_rpc(src_md, md) expected_RPC00B = '10123.000234.0000345604567+08.0000+017.0000+098709876506789+12.0000+109.0000+0034+0.000000E+0+9.870000E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' # Test loss of precision for key in ('LINE_OFF', 'SAMP_OFF', 'LAT_OFF', 'LONG_OFF', 'HEIGHT_OFF', 'LINE_SCALE', 'SAMP_SCALE', 'LAT_SCALE', 'LONG_SCALE', 'HEIGHT_SCALE'): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_md = copy.copy(src_md_max_precision) if src_md[key].find('.') < 0: src_md[key] += '.1' else: src_md[key] += '1' src_ds.SetMetadata(src_md, 'RPC') with gdaltest.error_handler(): ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) assert ds is not None, 'fail: expected a dataset' ds = None assert gdal.GetLastErrorMsg() != '', 'fail: expected a warning' assert gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None, \ 'fail: PAM file was expected' gdal.Unlink('/vsimem/nitf_72.ntf.aux.xml') ds = gdal.Open('/vsimem/nitf_72.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') assert RPC00B == expected_RPC00B_max_precision, \ 'fail: did not get expected RPC00B' # Test loss of precision on coefficient lines src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_md = copy.copy(src_md_max_precision) src_md['LINE_NUM_COEFF'] = '0 9.876543e-10 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9' src_ds.SetMetadata(src_md, 'RPC') with gdaltest.error_handler(): ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) assert ds is not None, 'fail: expected a dataset' ds = None assert gdal.GetLastErrorMsg() != '', 'fail: expected a warning' assert gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None, \ 'fail: PAM file was expected' gdal.Unlink('/vsimem/nitf_72.ntf.aux.xml') ds = gdal.Open('/vsimem/nitf_72.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_72.ntf') expected_RPC00B = '11234.562345.6734567845678-89.8765-179.1234-987698765467890-12.3456-123.4567-1234+0.000000E+0+0.000000E+0+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+1.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+2.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+3.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9+0.000000E+0+9.876543E+9+9.876543E-9-9.876543E+9-9.876543E-9' assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' # Test RPCTXT creation option with gdaltest.error_handler(): gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds, options=['RPCTXT=YES']) assert gdal.VSIStatL('/vsimem/nitf_72.ntf.aux.xml') is not None, \ 'fail: PAM file was expected' gdal.Unlink('/vsimem/nitf_72.ntf.aux.xml') assert gdal.VSIStatL('/vsimem/nitf_72_RPC.TXT') is not None, \ 'fail: rpc.txt file was expected' ds = gdal.Open('/vsimem/nitf_72.ntf') md = ds.GetMetadata('RPC') RPC00B = ds.GetMetadataItem('RPC00B', 'TRE') fl = ds.GetFileList() ds = None assert '/vsimem/nitf_72_RPC.TXT' in fl, \ 'fail: _RPC.TXT file not reported in file list' # Check that we get full precision from the _RPC.TXT file compare_rpc(src_md, md) assert RPC00B == expected_RPC00B, 'fail: did not get expected RPC00B' # Test out of range for key in ('LINE_OFF', 'SAMP_OFF', 'LAT_OFF', 'LONG_OFF', 'HEIGHT_OFF', 'LINE_SCALE', 'SAMP_SCALE', 'LAT_SCALE', 'LONG_SCALE', 'HEIGHT_SCALE'): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_md = copy.copy(src_md_max_precision) if src_md[key].find('-') >= 0: src_md[key] = '-1' + src_md[key][1:] else: src_md[key] = '1' + src_md[key] src_ds.SetMetadata(src_md, 'RPC') with gdaltest.error_handler(): ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) assert ds is None, ('fail: expected failure for %s' % key) # Test out of rangeon coefficient lines src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_md = copy.copy(src_md_max_precision) src_md['LINE_NUM_COEFF'] = '0 9.876543e10 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9 0 9.876543e+9 9.876543e-9 -9.876543e+9 -9.876543e-9' src_ds.SetMetadata(src_md, 'RPC') with gdaltest.error_handler(): ds = gdal.GetDriverByName('NITF').CreateCopy('/vsimem/nitf_72.ntf', src_ds) assert ds is None, 'fail: expected failure' ############################################################################### # Test case for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1525 def test_nitf_73(): with gdaltest.error_handler(): gdal.Open('data/nitf/oss_fuzz_1525.ntf') ############################################################################### # Test cases for CCLSTA # - Simple case def test_nitf_74(): ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_74.ntf', 1, 1, options=['FILE_TRE=CCINFA=0012AS 17ge:GENC:3:3-5:AUS00000']) ds = None ds = gdal.Open('/vsimem/nitf_74.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_74.ntf') expected_data = """ """ assert data == expected_data # - TABLE AG.2 case def test_nitf_75(): listing_AG1 = """ MMR http://api.nsgreg.nga.mil/geo-political/GENC/3/3-5 urn:us:gov:dod:nga:def:geo-political:GENC:3:3-5 geo-political:GENC:3:3-5 ge:GENC:3:3-5 MM http://api.nsgreg.nga.mil/geo-political/GENC/2/3-5 urn:us:gov:dod:nga:def:geo-political:GENC:2:3-5 geo-political:GENC:2:3-5 ge:GENC:2:3-5 104 http://api.nsgreg.nga.mil/geo-political/GENC/n/3-5 urn:us:gov:dod:nga:def:geo-political:GENC:n:3-5 geo-political:GENC:n:3-5 ge:GENC:n:3-5 exception 2016-09-30 unchanged independent MM-01 MM-02 MM-03 MM-04 MM-05 MM-06 MM-07 MM-11 MM-12 MM-13 MM-14 MM-15 MM-16 MM-17 MM-18 mya """ ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_75.ntf', 1, 1, options=['TRE=CCINFA=0062RQ 17ge:GENC:3:3-5:PRI000002RQ 20as:ISO2:6:II-3:US-PR000002BM 17ge:GENC:3:3-5:MMR04108 ' + listing_AG1 + '3MMR 19ge:ISO1:3:VII-7:MMR00000' + '2S1 19ge:GENC:3:3-alt:SCT000002YYC16gg:1059:2:ed9:3E00000']) ds = None ds = gdal.Open('/vsimem/nitf_75.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_75.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing MATESA TRE (STDI-0002 App AK) def test_nitf_76(): ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_76.ntf', 1, 1, options=['FILE_TRE=MATESA=EO-1_HYPERION FTITLE 006307APR2005_Hyperion_331406N0442000E_SWIR172_001_L1R-01B-BIB-GLAS0005RADIOMTRC_CALIB 0001EO-1_HYPERION FILENAME 0020HypGain_revC.dat.svfPARENT 0001EO-1_HYPERION FILENAME 0032EO12005097_020D020C_r1_WPS_01.L0PRE_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020A0209_r1_WPS_01.L0POST_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020F020E_r1_WPS_01.L0PARENT 0003EO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.L1REO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.AUXEO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.MET']) ds = None ds = gdal.Open('/vsimem/nitf_76.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_76.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing MATESA TRE (STDI-0002 App AK) def test_nitf_77(): ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_77.ntf', 1, 1, options=['TRE=GRDPSB=01+000027.81PIX_LATLON0000000000010000000000010000000000000000000000']) ds = None ds = gdal.Open('/vsimem/nitf_77.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_77.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing BANDSB TRE (STDI-0002 App X) def test_nitf_78(): float_data = "40066666" # == struct.pack(">f", 2.1).hex() bit_mask = "89800000" # Set bits 31, 27, 24, 23 tre_data = "TRE=HEX/BANDSB=" + hex_string("00001RADIANCE S") + float_data*2 + \ hex_string("0030.00M0030.00M-------M-------M ") + \ bit_mask + hex_string("DETECTOR ") + float_data + hex_string("U00.851920.01105") ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_78.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_78.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_78.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing ACCHZB TRE (STDI-0002-1-v5.0 Appendix P) def test_nitf_79(): tre_data = "TRE=ACCHZB=01M 00129M 00129004+044.4130499724+33.69234401034+044.4945572008" \ "+33.67855217830+044.1731373448+32.79106350687+044.2538103407+32.77733592314" ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_79.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_79.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_79.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing ACCVTB TRE (STDI-0002-1-v5.0 Appendix P) def test_nitf_80(): tre_data = "TRE=ACCVTB=01M 00095M 00095004+044.4130499724+33.69234401034+044.4945572008" \ "+33.67855217830+044.1731373448+32.79106350687+044.2538103407+32.77733592314" ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_80.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_80.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_80.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing MSTGTA TRE (STDI-0002-1-v5.0 App E) def test_nitf_81(): tre_data = "TRE=MSTGTA=012340123456789AB0123456789ABCDE0120123456789AB0123456789AB000123401234560123450TGT_LOC= " ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_81.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_81.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_81.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing PIATGB TRE (STDI-0002-1-v5.0 App C) def test_nitf_82(): tre_data = "TRE=PIATGB=0123456789ABCDE0123456789ABCDE01012340123456789ABCDE012" \ "TGTNAME= 012+01.234567-012.345678" ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_82.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_82.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_82.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing PIXQLA TRE (STDI-0002-1-v5.0 App AA) def test_nitf_83(): tre_data = "TRE=PIXQLA=00100200031Dead " \ "Saturated Bad " ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_83.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_83.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_83.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing PIXMTA TRE (STDI-0002-1-v5.0 App AJ) def test_nitf_84(): tre_data = "TRE=PIXMTA=0010020.00000000E+000.00000000E+001.00000000E+003.35200000E+03F00001P" \ "BAND_WAVELENGTH micron D00000" ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_84.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_84.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_84.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test creating a TRE with a hexadecimal string def test_nitf_85(): ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_85.ntf', 1, 1, options=["TRE=HEX/TSTTRE=414243"]) ds = None ds = gdal.Open('/vsimem/nitf_85.ntf') data = ds.GetMetadata('TRE')['TSTTRE'] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_85.ntf') expected_data = "ABC" assert data == expected_data ############################################################################### # Test parsing CSEXRB TRE (STDI-0002-1-v5.0 App AH) def test_nitf_86(): tre_data = "TRE=HEX/CSEXRB=" + hex_string("824ecf8e-1041-4cce-9edb-bc92d88624ca0047308e4b1-80e4-4777-b70f-f6e4a6881de9") + \ hex_string("17261ee9-2175-4ff2-86ad-dddda1f8270ccf306a0b-c47c-44fa-af63-463549f6bf98fd99a346-770e-4048-94d8-5a8b2e832b32") + \ hex_string("EO-1 HYPERNHYPERNF+03819809.03+03731961.77+03475785.73000000000120201012145900.000000000") + \ "0100000000000000" + "05" + "0000000100000001" "FFFFFFFFFF" + \ hex_string(" 1181.1 65535000335200256250.000") + \ hex_string(" 0000132.812+54.861 9991000000") ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_86.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_86.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_86.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing ILLUMB TRE (STDI-0002-1-v5.0 App AL) def test_nitf_87(): bit_mask = "7A0000" tre_data = "TRE=HEX/ILLUMB=" + hex_string("0001mm 8.5192000000E-01") + \ hex_string("2.5770800000E+00001NUM_BANDS=1 because ILLUMB has no band-dependent content ") + \ hex_string("World Geodetic System 1984 ") + \ hex_string("WGE World Geodetic System 1984 ") + \ hex_string("WE Geodetic ") + \ hex_string("GEOD") + \ bit_mask + hex_string("00120050407072410+33.234974+044.333405+27.8100000E+0132.8+54.9167.5+52.5") + \ hex_string("-163.4004099.2+84.0") ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_87.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_87.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_87.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing CSWRPB TRE (STDI-0002-1-v5.0 App AH) def test_nitf_88(): tre_data = "TRE=CSWRPB=1F199.9999999900000010000002000000300000040000005000000600000070000008" \ "1111-9.99999999999999E-99+9.99999999999999E+9900000" ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_88.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_88.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_88.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test parsing CSRLSB TRE (STDI-0002-1-v5.0 App AH) def test_nitf_89(): tre_data = "TRE=CSRLSB=0101+11111111.11-22222222.22+33333333.33-44444444.44" ds = gdal.GetDriverByName('NITF').Create('/vsimem/nitf_89.ntf', 1, 1, options=[tre_data]) ds = None ds = gdal.Open('/vsimem/nitf_89.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None gdal.GetDriverByName('NITF').Delete('/vsimem/nitf_89.ntf') expected_data = """ """ assert data == expected_data ############################################################################### # Test reading C4 compressed file def test_nitf_read_C4(): ds = gdal.Open('data/nitf/RPFTOC01.ON2') cs = ds.GetRasterBand(1).Checksum() assert cs == 53599 ############################################################################### # Test reading a file with a SENSRB TRE def test_nitf_SENSRB(): ds = gdal.Open('data/nitf/SENSRB_TRE.ntf') data = ds.GetMetadata('xml:TRE')[0] ds = None expected_data = """ """ assert data == expected_data, data ############################################################################### # Verify we can read UDID metadata def test_nitf_valid_udid(): ds = gdal.Open('data/nitf/valid_udid.ntf') md = ds.GetMetadata() assert md['NITF_CSDIDA_YEAR'] == '2019', \ 'UDID CSDIDA metadata has unexpected value.' assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01', \ 'BLOCKA metadata has unexpected value.' ############################################################################### # Verify that bad UDID metadata doesn't prevent reading IXSHD metadata def test_nitf_invalid_udid(): ds = gdal.Open('data/nitf/invalid_udid.ntf') md = ds.GetMetadata() assert 'NITF_CSDIDA_YEAR' not in md, \ 'Unexpected parings of UDID CSDIDA metadata.' assert md['NITF_BLOCKA_BLOCK_INSTANCE_01'] == '01', \ 'BLOCKA metadata has unexpected value.' ############################################################################### # Test NITF21_CGM_ANNO_Uncompressed_unmasked.ntf for bug #1313 and #1714 def test_nitf_online_1(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/bugs/NITF21_CGM_ANNO_Uncompressed_unmasked.ntf', 'NITF21_CGM_ANNO_Uncompressed_unmasked.ntf'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/NITF21_CGM_ANNO_Uncompressed_unmasked.ntf', 1, 13123, filename_absolute=1) # Shut up the warning about missing image segment gdal.PushErrorHandler('CPLQuietErrorHandler') ret = tst.testOpen() gdal.PopErrorHandler() return ret ############################################################################### # Test NITF file with multiple images def test_nitf_online_2(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/nitf1.1/U_0001a.ntf', 'U_0001a.ntf'): pytest.skip() ds = gdal.Open('tmp/cache/U_0001a.ntf') md = ds.GetMetadata('SUBDATASETS') assert 'SUBDATASET_1_NAME' in md, 'missing SUBDATASET_1_NAME metadata' ds = None ############################################################################### # Test ARIDPCM (C2) image def test_nitf_online_3(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/nitf1.1/U_0001a.ntf', 'U_0001a.ntf'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'NITF_IM:3:tmp/cache/U_0001a.ntf', 1, 23463, filename_absolute=1) return tst.testOpen() ############################################################################### # Test Vector Quantization (VQ) (C4) file def test_nitf_online_4(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/cadrg/001zc013.on1', '001zc013.on1'): pytest.skip() # check that the RPF attribute metadata was carried through. ds = gdal.Open('tmp/cache/001zc013.on1') md = ds.GetMetadata() assert md['NITF_RPF_CurrencyDate'] == '19950720' and md['NITF_RPF_ProductionDate'] == '19950720' and md['NITF_RPF_SignificantDate'] == '19890629', \ 'RPF attribute metadata not captured (#3413)' ds = None tst = gdaltest.GDALTest('NITF', 'tmp/cache/001zc013.on1', 1, 53960, filename_absolute=1) return tst.testOpen() ############################################################################### # Test Vector Quantization (VQ) (M4) file def test_nitf_online_5(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/cadrg/overview.ovr', 'overview.ovr'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/overview.ovr', 1, 60699, filename_absolute=1) return tst.testOpen() ############################################################################### # Test a JPEG compressed, single blocked 2048x2048 mono image def test_nitf_online_6(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/nitf2.0/U_4001b.ntf', 'U_4001b.ntf'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/U_4001b.ntf', 1, 60030, filename_absolute=1) return tst.testOpen() ############################################################################### # Test all combinations of IMODE (S,P,B,R) for an image with 6 bands whose 3 are RGB def test_nitf_online_7(): for filename in ['ns3228b.nsf', 'i_3228c.ntf', 'ns3228d.nsf', 'i_3228e.ntf']: if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/' + filename, filename): pytest.skip() ds = gdal.Open('tmp/cache/' + filename) assert ds.RasterCount == 6 checksums = [48385, 48385, 40551, 54223, 48385, 33094] colorInterpretations = [gdal.GCI_Undefined, gdal.GCI_Undefined, gdal.GCI_RedBand, gdal.GCI_BlueBand, gdal.GCI_Undefined, gdal.GCI_GreenBand] for i in range(6): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == checksums[i], ('got checksum %d for image %s' % (cs, filename)) assert ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == colorInterpretations[i], \ ('got wrong color interp for image %s' % filename) ds = None ############################################################################### # Test JPEG-compressed multi-block mono-band image with a data mask subheader (IC=M3, IMODE=B) def test_nitf_online_8(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3301j.nsf', 'ns3301j.nsf'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/ns3301j.nsf', 1, 56861, filename_absolute=1) return tst.testOpen() ############################################################################### # Test JPEG-compressed multi-block mono-band image without a data mask subheader (IC=C3, IMODE=B) def test_nitf_online_9(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3304a.nsf', 'ns3304a.nsf'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/ns3304a.nsf', 1, 32419, filename_absolute=1) return tst.testOpen() ############################################################################### # Verify that CGM access on a file with 8 CGM segments def test_nitf_online_10(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3119b.nsf', 'ns3119b.nsf'): pytest.skip() # Shut up the warning about missing image segment gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('tmp/cache/ns3119b.nsf') gdal.PopErrorHandler() mdCGM = ds.GetMetadata('CGM') ds = None assert mdCGM['SEGMENT_COUNT'] == '8', 'wrong SEGMENT_COUNT.' tab = [ ('SEGMENT_0_SLOC_ROW', '0'), ('SEGMENT_0_SLOC_COL', '0'), ('SEGMENT_0_CCS_COL', '0'), ('SEGMENT_0_CCS_COL', '0'), ('SEGMENT_0_SDLVL', '1'), ('SEGMENT_0_SALVL', '0'), ('SEGMENT_1_SLOC_ROW', '0'), ('SEGMENT_1_SLOC_COL', '684'), ('SEGMENT_2_SLOC_ROW', '0'), ('SEGMENT_2_SLOC_COL', '1364'), ('SEGMENT_3_SLOC_ROW', '270'), ('SEGMENT_3_SLOC_COL', '0'), ('SEGMENT_4_SLOC_ROW', '270'), ('SEGMENT_4_SLOC_COL', '684'), ('SEGMENT_5_SLOC_ROW', '270'), ('SEGMENT_5_SLOC_COL', '1364'), ('SEGMENT_6_SLOC_ROW', '540'), ('SEGMENT_6_SLOC_COL', '0'), ('SEGMENT_7_SLOC_ROW', '540'), ('SEGMENT_7_SLOC_COL', '1364'), ('SEGMENT_7_CCS_ROW', '540'), ('SEGMENT_7_CCS_COL', '1364'), ('SEGMENT_7_SDLVL', '8'), ('SEGMENT_7_SALVL', '0'), ] for item in tab: assert mdCGM[item[0]] == item[1], ('wrong value for %s.' % item[0]) ############################################################################### # 5 text files def test_nitf_online_11(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/nitf2.0/U_1122a.ntf', 'U_1122a.ntf'): pytest.skip() ds = gdal.Open('tmp/cache/U_1122a.ntf') mdTEXT = ds.GetMetadata('TEXT') ds = None assert mdTEXT['DATA_0'] == 'This is test text file 01.\r\n', \ 'did not find expected DATA_0 from metadata.' assert mdTEXT['DATA_1'] == 'This is test text file 02.\r\n', \ 'did not find expected DATA_1 from metadata.' assert mdTEXT['DATA_2'] == 'This is test text file 03.\r\n', \ 'did not find expected DATA_2 from metadata.' assert mdTEXT['DATA_3'] == 'This is test text file 04.\r\n', \ 'did not find expected DATA_3 from metadata.' assert mdTEXT['DATA_4'] == 'This is test text file 05.\r\n', \ 'did not find expected DATA_4 from metadata.' ############################################################################### # Test 12 bit uncompressed image. def test_nitf_online_12(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/bugs/i_3430a.ntf', 'i_3430a.ntf'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/i_3430a.ntf', 1, 38647, filename_absolute=1) return tst.testOpen() ############################################################################### # Test complex relative graphic/image attachment. def test_nitf_online_13(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/u_3054a.ntf', 'u_3054a.ntf'): pytest.skip() # Shut up the warning about missing image segment ds = gdal.Open('NITF_IM:2:tmp/cache/u_3054a.ntf') mdCGM = ds.GetMetadata('CGM') md = ds.GetMetadata() ds = None assert mdCGM['SEGMENT_COUNT'] == '3', 'wrong SEGMENT_COUNT.' tab = [ ('SEGMENT_2_SLOC_ROW', '0'), ('SEGMENT_2_SLOC_COL', '0'), ('SEGMENT_2_CCS_COL', '1100'), ('SEGMENT_2_CCS_COL', '1100'), ('SEGMENT_2_SDLVL', '6'), ('SEGMENT_2_SALVL', '3') ] for item in tab: assert mdCGM[item[0]] == item[1], ('wrong value for %s.' % item[0]) tab = [ ('NITF_IDLVL', '3'), ('NITF_IALVL', '1'), ('NITF_ILOC_ROW', '1100'), ('NITF_ILOC_COLUMN', '1100'), ('NITF_CCS_ROW', '1100'), ('NITF_CCS_COLUMN', '1100'), ] for item in tab: assert md[item[0]] == item[1], ('wrong value for %s, got %s instead of %s.' % (item[0], md[item[0]], item[1])) ############################################################################### # Check reading a 12-bit JPEG compressed NITF (multi-block) def test_nitf_online_14(not_jpeg_9b): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/nitf2.0/U_4020h.ntf', 'U_4020h.ntf'): pytest.skip() try: os.remove('tmp/cache/U_4020h.ntf.aux.xml') except OSError: pass # Check if JPEG driver supports 12bit JPEG reading/writing jpg_drv = gdal.GetDriverByName('JPEG') md = jpg_drv.GetMetadata() if md[gdal.DMD_CREATIONDATATYPES].find('UInt16') == -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() ds = gdal.Open('tmp/cache/U_4020h.ntf') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[2] >= 2607 and stats[2] <= 2608 ds = None try: os.remove('tmp/cache/U_4020h.ntf.aux.xml') except OSError: pass ############################################################################### # Test opening a IC=C8 NITF file with the various JPEG2000 drivers def nitf_online_15(driver_to_test, expected_cs=1054): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/p0_01/p0_01a.ntf', 'p0_01a.ntf'): pytest.skip() jp2_drv = gdal.GetDriverByName(driver_to_test) if jp2_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) ds = gdal.Open('tmp/cache/p0_01a.ntf') if ds.GetRasterBand(1).Checksum() == expected_cs: ret = 'success' else: print(ds.GetRasterBand(1).Checksum()) gdaltest.post_reason('Did not get expected checksums') ret = 'fail' gdaltest.reregister_all_jpeg2000_drivers() return ret def test_nitf_online_15_jp2ecw(): return nitf_online_15('JP2ECW') def test_nitf_online_15_jp2mrsid(): return nitf_online_15('JP2MrSID') def test_nitf_online_15_jp2kak(): return nitf_online_15('JP2KAK') def test_nitf_online_15_jasper(): return nitf_online_15('JPEG2000') def test_nitf_online_15_openjpeg(): return nitf_online_15('JP2OpenJPEG') ############################################################################### # Test opening a IC=C8 NITF file which has 256-entry palette/LUT in both JP2 Header and image Subheader # We expect RGB expansion from some JPEG2000 driver def nitf_online_16(driver_to_test): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9_jp2_2places.ntf', 'file9_jp2_2places.ntf'): pytest.skip() jp2_drv = gdal.GetDriverByName(driver_to_test) if jp2_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) ds = gdal.Open('tmp/cache/file9_jp2_2places.ntf') # JPEG2000 driver if ds.RasterCount == 3 and \ ds.GetRasterBand(1).Checksum() == 48954 and \ ds.GetRasterBand(2).Checksum() == 4939 and \ ds.GetRasterBand(3).Checksum() == 17734: ret = 'success' elif ds.RasterCount == 1 and \ ds.GetRasterBand(1).Checksum() == 47664 and \ ds.GetRasterBand(1).GetRasterColorTable() is not None: ret = 'success' else: print(ds.RasterCount) for i in range(ds.RasterCount): print(ds.GetRasterBand(i + 1).Checksum()) print(ds.GetRasterBand(1).GetRasterColorTable()) gdaltest.post_reason('Did not get expected checksums') ret = 'fail' gdaltest.reregister_all_jpeg2000_drivers() return ret def test_nitf_online_16_jp2ecw(): return nitf_online_16('JP2ECW') def test_nitf_online_16_jp2mrsid(): return nitf_online_16('JP2MrSID') def test_nitf_online_16_jp2kak(): return nitf_online_16('JP2KAK') def test_nitf_online_16_jasper(): return nitf_online_16('JPEG2000') def test_nitf_online_16_openjpeg(): return nitf_online_16('JP2OpenJPEG') ############################################################################### # Test opening a IC=C8 NITF file which has 256-entry/LUT in Image Subheader, JP2 header completely removed # We don't expect RGB expansion from the JPEG2000 driver def nitf_online_17(driver_to_test): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9_j2c.ntf', 'file9_j2c.ntf'): pytest.skip() jp2_drv = gdal.GetDriverByName(driver_to_test) if jp2_drv is None: pytest.skip() # Deregister other potential conflicting JPEG2000 drivers gdaltest.deregister_all_jpeg2000_drivers_but(driver_to_test) ds = gdal.Open('tmp/cache/file9_j2c.ntf') if ds.RasterCount == 1 and \ ds.GetRasterBand(1).Checksum() == 47664 and \ ds.GetRasterBand(1).GetRasterColorTable() is not None: ret = 'success' else: print(ds.RasterCount) for i in range(ds.RasterCount): print(ds.GetRasterBand(i + 1).Checksum()) print(ds.GetRasterBand(1).GetRasterColorTable()) gdaltest.post_reason('Did not get expected checksums') ret = 'fail' gdaltest.reregister_all_jpeg2000_drivers() return ret def test_nitf_online_17_jp2ecw(): return nitf_online_17('JP2ECW') def test_nitf_online_17_jp2mrsid(): return nitf_online_17('JP2MrSID') def test_nitf_online_17_jp2kak(): return nitf_online_17('JP2KAK') def test_nitf_online_17_jasper(): return nitf_online_17('JPEG2000') def test_nitf_online_17_openjpeg(): return nitf_online_17('JP2OpenJPEG') ############################################################################### # Test polar stereographic CADRG tile. def test_nitf_online_18(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/bugs/bug3337.ntf', 'bug3337.ntf'): pytest.skip() ds = gdal.Open('tmp/cache/bug3337.ntf') gt = ds.GetGeoTransform() prj = ds.GetProjection() # If we have functioning coordinate transformer. if prj[:6] == 'PROJCS': assert prj.find('Azimuthal_Equidistant') != -1, 'wrong projection?' expected_gt = (-1669792.3618991028, 724.73626818537502, 0.0, -556597.45396636717, 0.0, -724.73626818537434) assert gdaltest.geotransform_equals(gt, expected_gt, 1.0), \ 'did not get expected geotransform.' # If we do not have a functioning coordinate transformer. else: assert prj == '' and gdaltest.geotransform_equals(gt, (0, 1, 0, 0, 0, 1), 0.00000001), \ 'did not get expected empty gt/projection' prj = ds.GetGCPProjection() assert prj[:6] == 'GEOGCS', 'did not get expected geographic srs' gcps = ds.GetGCPs() gcp3 = gcps[3] assert gcp3.GCPPixel == 0 and gcp3.GCPLine == 1536 and abs(gcp3.GCPX + 45) <= 0.0000000001 and gcp3.GCPY == pytest.approx(68.78679656, abs=0.00000001), \ 'did not get expected gcp.' ds = None ############################################################################### # Test CADRG tile crossing dateline (#3383) def test_nitf_online_19(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/0000M033.GN3', '0000M033.GN3'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/0000M033.GN3', 1, 38928, filename_absolute=1) return tst.testOpen(check_gt=(174.375000000000000, 0.010986328125000, 0, 51.923076923076927, 0, -0.006760817307692)) ############################################################################### # Check that the RPF attribute metadata was carried through. # Special case where the reported size of the attribute subsection is # smaller than really available def test_nitf_online_20(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/0000M033.GN3', '0000M033.GN3'): pytest.skip() # check that the RPF attribute metadata was carried through. # Special case where the reported size of the attribute subsection is # smaller than really available ds = gdal.Open('tmp/cache/0000M033.GN3') md = ds.GetMetadata() assert md['NITF_RPF_CurrencyDate'] == '19941201' and md['NITF_RPF_ProductionDate'] == '19980511' and md['NITF_RPF_SignificantDate'] == '19850305', \ 'RPF attribute metadata not captured (#3413)' ############################################################################### # Check that we can read NITF header located in STREAMING_FILE_HEADER DE # segment when header at beginning of file is incomplete def test_nitf_online_21(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv2_1/ns3321a.nsf', 'ns3321a.nsf'): pytest.skip() ds = gdal.Open('tmp/cache/ns3321a.nsf') md = ds.GetMetadata() ds = None # If we get NS3321A, it means we are not exploiting the header from the STREAMING_FILE_HEADER DE segment assert md['NITF_OSTAID'] == 'I_3321A', \ 'did not get expected OSTAID value' ############################################################################### # Test fix for #3002 (reconcile NITF file with LA segments) # def test_nitf_online_22(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Nitfv1_1/U_0001C.NTF', 'U_0001C.NTF'): pytest.skip() ds = gdal.Open('NITF_IM:1:tmp/cache/U_0001C.NTF') md = ds.GetMetadata() ds = None tab = [ ('NITF_IDLVL', '6'), ('NITF_IALVL', '1'), ('NITF_ILOC_ROW', '360'), ('NITF_ILOC_COLUMN', '380'), ('NITF_CCS_ROW', '425'), ('NITF_CCS_COLUMN', '410'), ] for item in tab: assert md[item[0]] == item[1], ('(1) wrong value for %s, got %s instead of %s.' % (item[0], md[item[0]], item[1])) ds = gdal.Open('NITF_IM:2:tmp/cache/U_0001C.NTF') md = ds.GetMetadata() ds = None tab = [ ('NITF_IDLVL', '11'), ('NITF_IALVL', '2'), ('NITF_ILOC_ROW', '360'), ('NITF_ILOC_COLUMN', '40'), ('NITF_CCS_ROW', '422'), ('NITF_CCS_COLUMN', '210'), ] for item in tab: assert md[item[0]] == item[1], ('(2) wrong value for %s, got %s instead of %s.' % (item[0], md[item[0]], item[1])) ds = gdal.Open('NITF_IM:3:tmp/cache/U_0001C.NTF') md = ds.GetMetadata() ds = None tab = [ ('NITF_IDLVL', '5'), ('NITF_IALVL', '3'), ('NITF_ILOC_ROW', '40'), ('NITF_ILOC_COLUMN', '240'), ('NITF_CCS_ROW', '-1'), ('NITF_CCS_COLUMN', '-1'), ] for item in tab: assert md[item[0]] == item[1], ('(3) wrong value for %s, got %s instead of %s.' % (item[0], md[item[0]], item[1])) ds = gdal.Open('NITF_IM:4:tmp/cache/U_0001C.NTF') md = ds.GetMetadata() ds = None tab = [ ('NITF_IDLVL', '1'), ('NITF_IALVL', '0'), ('NITF_ILOC_ROW', '65'), ('NITF_ILOC_COLUMN', '30'), ('NITF_CCS_ROW', '65'), ('NITF_CCS_COLUMN', '30'), ] for item in tab: assert md[item[0]] == item[1], ('(4) wrong value for %s, got %s instead of %s.' % (item[0], md[item[0]], item[1])) ############################################################################### # Test reading a M4 compressed file (fixed for #3848) def test_nitf_online_23(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/nitf/nitf2.0/U_3058b.ntf', 'U_3058b.ntf'): pytest.skip() tst = gdaltest.GDALTest('NITF', 'tmp/cache/U_3058b.ntf', 1, 44748, filename_absolute=1) return tst.testOpen() ############################################################################### # Test reading ECRG frames def test_nitf_online_24(): if not gdaltest.download_file('http://www.falconview.org/trac/FalconView/downloads/17', 'ECRG_Sample.zip'): pytest.skip() try: os.stat('tmp/cache/ECRG_Sample.zip') except OSError: pytest.skip() oldval = gdal.GetConfigOption('NITF_OPEN_UNDERLYING_DS') gdal.SetConfigOption('NITF_OPEN_UNDERLYING_DS', 'NO') ds = gdal.Open('/vsizip/tmp/cache/ECRG_Sample.zip/ECRG_Sample/EPF/clfc/2/000000009s0013.lf2') gdal.SetConfigOption('NITF_OPEN_UNDERLYING_DS', oldval) assert ds is not None xml_tre = ds.GetMetadata('xml:TRE')[0] ds = None assert (not (xml_tre.find(' # ############################################################################### # Copyright (c) 2014, Matthieu Volat # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Perform simple read test. def test_roipac_1(): tst = gdaltest.GDALTest('roi_pac', 'roipac/srtm.dem', 1, 64074) prj = """GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4326"]]""" return tst.testOpen(check_prj=prj, check_gt=(-180.0083333, 0.0083333333, 0.0, -59.9916667, 0.0, -0.0083333333)) ############################################################################### # Test reading of metadata from the ROI_PAC metadata domain def test_roipac_2(): ds = gdal.Open('data/roipac/srtm.dem') val = ds.GetMetadataItem('YMAX', 'ROI_PAC') assert val == '9' ############################################################################### # Verify this can be exported losslessly. def test_roipac_3(): tst = gdaltest.GDALTest('roi_pac', 'roipac/srtm.dem', 1, 64074) return tst.testCreateCopy(check_gt=1, new_filename='strm.tst.dem') ############################################################################### # Verify VSIF*L capacity def test_roipac_4(): tst = gdaltest.GDALTest('roi_pac', 'roipac/srtm.dem', 1, 64074) return tst.testCreateCopy(check_gt=1, new_filename='strm.tst.dem', vsimem=1) ############################################################################### # Verify offset/scale metadata reading def test_roipac_5(): ds = gdal.Open('data/roipac/srtm.dem') band = ds.GetRasterBand(1) offset = band.GetOffset() assert offset == 1 scale = band.GetScale() assert scale == 2 ############################################################################### # Test .flg def test_roipac_6(): tst = gdaltest.GDALTest('roi_pac', 'byte.tif', 1, 4672) with gdaltest.error_handler(): ret = tst.testCreateCopy(check_gt=1, new_filename='byte.flg', vsimem=1) return ret gdalautotest-3.2.2/gdrivers/png_profile.py0000775000175000017500000002347514020414367017416 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: png_profile.py 2da6e90962a140a55650fd7ccf263cbf84c52b9c 2019-08-07 14:31:52 +1200 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic support for ICC profile in PNG file. # ############################################################################### # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. ############################################################################### ############################################################################### # This unit test uses a free ICC profile by Marti Maria (littleCMS) # # sRGB.icc uses the zlib license. # Part of a free package of ICC profile found at: # http://sourceforge.net/projects/openicc/files/OpenICC-Profiles/ import os import base64 from osgeo import gdal import pytest ############################################################################### # Test writing and reading of ICC profile in CreateCopy() def test_png_copy_icc(): f = open('data/sRGB.icc', 'rb') data = f.read() icc = base64.b64encode(data).decode('ascii') f.close() # Create dummy file options = ['SOURCE_ICC_PROFILE=' + icc] driver = gdal.GetDriverByName('PNG') driver_tiff = gdal.GetDriverByName('GTiff') ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) # Check with dataset from CreateCopy() ds2 = driver.CreateCopy('tmp/icc_test.png', ds) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE'] == icc with pytest.raises(OSError): os.stat('tmp/icc_test.png.aux.xml') # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test.png') md = ds2.GetMetadata("COLOR_PROFILE") ds2 = None with pytest.raises(OSError): os.stat('tmp/icc_test.png.aux.xml') assert md['SOURCE_ICC_PROFILE'] == icc # Check again with GetMetadataItem() ds2 = gdal.Open('tmp/icc_test.png') source_icc_profile = ds2.GetMetadataItem("SOURCE_ICC_PROFILE", "COLOR_PROFILE") ds2 = None with pytest.raises(OSError): os.stat('tmp/icc_test.png.aux.xml') assert source_icc_profile == icc driver_tiff.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test.png') def cvtTuple2String(t): return str(t).lstrip('([').rstrip(')]') ############################################################################### # Test writing and reading of ICC profile in CreateCopy() options def test_png_copy_options_icc(): f = open('data/sRGB.icc', 'rb') data = f.read() icc = base64.b64encode(data).decode('ascii') f.close() # Create dummy file options = ['SOURCE_ICC_PROFILE=' + icc] driver = gdal.GetDriverByName('PNG') driver_tiff = gdal.GetDriverByName('GTiff') ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE'] == icc # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test.png') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE'] == icc driver_tiff.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test.png') ############################################################################### # Test writing and reading of ICC colorimetric data from options def test_png_copy_options_colorimetric_data(): # sRGB values source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint), 'PNG_GAMMA=1.5'] driver = gdal.GetDriverByName('PNG') driver_tiff = gdal.GetDriverByName('GTiff') ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) assert float(md['PNG_GAMMA']) == 1.5 # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test.png') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) assert float(md['PNG_GAMMA']) == 1.5 driver_tiff.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test.png') ############################################################################### # Test writing and reading of ICC colorimetric data in the file def test_png_copy_colorimetric_data(): # sRGB values source_primaries = [(0.64, 0.33, 1.0), (0.3, 0.6, 1.0), (0.15, 0.06, 1.0)] source_whitepoint = (0.31271, 0.32902, 1.0) options = ['SOURCE_PRIMARIES_RED=' + cvtTuple2String(source_primaries[0]), 'SOURCE_PRIMARIES_GREEN=' + cvtTuple2String(source_primaries[1]), 'SOURCE_PRIMARIES_BLUE=' + cvtTuple2String(source_primaries[2]), 'SOURCE_WHITEPOINT=' + cvtTuple2String(source_whitepoint)] options2 = ['PNG_GAMMA=1.5'] driver = gdal.GetDriverByName('PNG') driver_tiff = gdal.GetDriverByName('GTiff') ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte, options) ds = None ds = gdal.Open('tmp/icc_test.tiff') # Check with dataset from CreateCopy() ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options2) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) assert float(md['PNG_GAMMA']) == 1.5 # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test.png') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None source_whitepoint2 = eval('(' + md['SOURCE_WHITEPOINT'] + ')') for i in range(0, 3): assert source_whitepoint2[i] == pytest.approx(source_whitepoint[i], abs=0.0001) source_primaries2 = [ eval('(' + md['SOURCE_PRIMARIES_RED'] + ')'), eval('(' + md['SOURCE_PRIMARIES_GREEN'] + ')'), eval('(' + md['SOURCE_PRIMARIES_BLUE'] + ')')] for j in range(0, 3): for i in range(0, 3): assert source_primaries2[j][i] == pytest.approx(source_primaries[j][i], abs=0.0001) assert float(md['PNG_GAMMA']) == 1.5 driver_tiff.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test.png') ############################################################################### # Test sRGB def test_png_sRGB(): # Create dummy file options = ['SOURCE_ICC_PROFILE_NAME=sRGB'] driver = gdal.GetDriverByName('PNG') driver_tiff = gdal.GetDriverByName('GTiff') ds = driver_tiff.Create('tmp/icc_test.tiff', 64, 64, 3, gdal.GDT_Byte) # Check with dataset from CreateCopy() ds2 = driver.CreateCopy('tmp/icc_test.png', ds, options=options) md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE_NAME'] == 'sRGB' # Check again with dataset from Open() ds2 = gdal.Open('tmp/icc_test.png') md = ds2.GetMetadata("COLOR_PROFILE") ds = None ds2 = None assert md['SOURCE_ICC_PROFILE_NAME'] == 'sRGB' driver_tiff.Delete('tmp/icc_test.tiff') driver.Delete('tmp/icc_test.png') ############################################################################ gdalautotest-3.2.2/gdrivers/envisat.py0000775000175000017500000003006314020414367016552 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: envisat.py 2da6e90962a140a55650fd7ccf263cbf84c52b9c 2019-08-07 14:31:52 +1200 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for ENVISAT driver. # Author: Antonio Valentino # ############################################################################### # Copyright (c) 2011, Antonio Valentino # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import gzip from osgeo import gdal import gdaltest import pytest def _get_mds_num(filename): mph_size = 1247 fd = open(filename, 'rb') mph = fd.read(mph_size) for line in mph.splitlines(): line = line.decode('iso8859-1') if line.startswith('SPH_SIZE'): sph_size = int(line.split('=')[-1][:-7]) break else: return sph = fd.read(sph_size) sph = '\n'.join(line.decode('iso8859-1').rstrip() for line in sph.splitlines()) count = 0 for block in sph.split('\n\n'): if block.startswith('DS_NAME'): ds_type = None ds_size = 0 for line in block.splitlines(): if line.startswith('DS_TYPE'): ds_type = line.split('=')[-1] elif line.startswith('DS_SIZE'): ds_size = int(line.split('=')[-1][:-7]) if ds_type == 'M' and ds_size > 0: count += 1 return count ############################################################################### # class EnvisatTestBase(object): # Just a base class def download_file(self): # download and decompress if not gdaltest.download_file(self.downloadURL, os.path.basename(self.downloadURL), -1): return False filename = os.path.join('tmp', 'cache', self.fileName) if os.path.exists(filename): return True # decompress f_in = gzip.open(os.path.join('tmp', 'cache', os.path.basename(self.downloadURL))) f_out = open(filename, 'wb') f_out.write(f_in.read()) f_in.close() f_out.close() return True def test_envisat_1(self): if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None assert (ds.RasterXSize, ds.RasterYSize) == self.size, \ ('Bad size. Expected %s, got %s' % (self.size, (ds.RasterXSize, ds.RasterYSize))) def test_envisat_2(self): if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None assert ds.GetRasterBand(1).Checksum() == self.checksum, \ ('Bad checksum. Expected %d, got %d' % (self.checksum, ds.GetRasterBand(1).Checksum())) def test_envisat_3(self): # Regression test for #3160 and #3709. if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None d = {} for gcp in ds.GetGCPs(): lp = (gcp.GCPLine, gcp.GCPPixel) if lp in d: pytest.fail('Duplicate GCP coordinates.') else: d[lp] = (gcp.GCPX, gcp.GCPY, gcp.GCPZ) def test_envisat_4(self): # test number of bands if not self.download_file(): pytest.skip() filename = os.path.join('tmp', 'cache', self.fileName) mds_num = _get_mds_num(filename) ds = gdal.Open(filename) assert ds is not None assert ds.RasterCount >= mds_num, 'Not all bands have been detected' def test_envisat_5(self): # test metadata in RECORDS domain if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None product = ds.GetMetadataItem('MPH_PRODUCT') record_md = ds.GetMetadata('RECORDS') assert product[:3] in ('ASA', 'SAR', 'MER') or not record_md, \ 'Unexpected metadata in the "RECORDS" domain.' ############################################################################### # class TestEnvisatASAR(EnvisatTestBase): downloadURL = 'http://earth.esa.int/services/sample_products/asar/DS1/WS/ASA_WS__BPXPDE20020714_100425_000001202007_00380_01937_0053.N1.gz' fileName = 'ASA_WS__BPXPDE20020714_100425_000001202007_00380_01937_0053.N1' size = (524, 945) checksum = 44998 def test_envisat_asar_1(self): # test sensor ID if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None product = ds.GetMetadataItem('MPH_PRODUCT') assert product[:3] in ('ASA', 'SAR'), 'Wrong sensor ID.' def test_envisat_asar_2(self): # test metadata in RECORDS domain if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None product = ds.GetMetadataItem('MPH_PRODUCT') record_md = ds.GetMetadata('RECORDS') assert record_md, 'Unable to read ADS metadata from ASAR.' record = 'SQ_ADS' # it is present in all ASAR poducts if product.startswith('ASA_WV'): for field in ('ZERO_DOPPLER_TIME', 'INPUT_MEAN', 'INPUT_STD_DEV', 'PHASE_CROSS_CONF'): key0 = '%s_%s' % (record, field) key1 = '%s_0_%s' % (record, field) assert key0 in record_md or key1 in record_md, \ ('No "%s" or "%s" key in "RECORDS" domain.' % (key0, key1)) else: for mds in range(1, ds.RasterCount + 1): for field in ('ZERO_DOPPLER_TIME', 'INPUT_MEAN', 'INPUT_STD_DEV'): key0 = 'MDS%d_%s_%s' % (mds, record, field) key1 = 'MDS%d_%s_0_%s' % (mds, record, field) assert key0 in record_md or key1 in record_md, \ ('No "%s" or "%s" key in "RECORDS" domain.' % (key0, key1)) ############################################################################### # class TestEnvisatMERIS(EnvisatTestBase): downloadURL = 'http://earth.esa.int/services/sample_products/meris/RRC/L2/MER_RRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1.gz' fileName = 'MER_RRC_2PTGMV20000620_104318_00000104X000_00000_00000_0001.N1' size = (1121, 593) checksum = 55146 def test_envisat_meris_1(self): # test sensor ID if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None product = ds.GetMetadataItem('MPH_PRODUCT') assert product[:3] in ('MER',), 'Wrong sensor ID.' def test_envisat_meris_2(self): # test metadata in RECORDS domain if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None record_md = ds.GetMetadata('RECORDS') assert record_md, 'Unable to read ADS metadata from ASAR.' record = 'Quality_ADS' # it is present in all MER poducts for field in ('DSR_TIME', 'ATTACH_FLAG'): key0 = '%s_%s' % (record, field) key1 = '%s_0_%s' % (record, field) assert key0 in record_md or key1 in record_md, \ ('No "%s" or "%s" key in "RECORDS" domain.' % (key0, key1)) def test_envisat_meris_3(self): # test Flag bands if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None flags_band = None detector_index_band = None for bandno in range(1, ds.RasterCount + 1): band = ds.GetRasterBand(bandno) name = band.GetDescription() if 'Flags' in name: flags_band = bandno if name.startswith('Detector index'): detector_index_band = bandno product = ds.GetMetadataItem('MPH_PRODUCT') level = product[8] if level == '1': assert flags_band, 'No flag band in MERIS Level 1 product.' band = ds.GetRasterBand(flags_band) assert band.DataType == gdal.GDT_Byte, \ ('Incorrect data type of the flag band in ' 'MERIS Level 1 product.') assert detector_index_band, ('No "detector index" band in MERIS ' 'Level 1 product.') band = ds.GetRasterBand(detector_index_band) assert band.DataType == gdal.GDT_Int16, ('Incorrect data type of the ' '"detector index" band in MERIS Level 2 ' 'product.') elif level == '2': assert flags_band, 'No flag band in MERIS Level 2 product.' band = ds.GetRasterBand(flags_band) assert band.DataType == gdal.GDT_UInt32, \ ('Incorrect data type of the flag band in ' 'MERIS Level 2 product.') else: pytest.fail('Invalid product level: %s.' % level) def test_envisat_meris_4(self): # test DEM corrections (see #5423) if not self.download_file(): pytest.skip() ds = gdal.Open(os.path.join('tmp', 'cache', self.fileName)) assert ds is not None gcp_values = [ (gcp.Id, gcp.GCPLine, gcp.GCPPixel, gcp.GCPX, gcp.GCPY, gcp.GCPZ) for gcp in ds.GetGCPs() ] ref = [ ('1', 0.5, 0.5, 6.484722, 47.191889, 0.0), ('2', 0.5, 16.5, 6.279611, 47.245535999999994, 0.0), ('3', 0.5, 32.5, 6.074068, 47.298809, 0.0), ('4', 0.5, 48.5, 5.868156999999999, 47.351724999999995, 0.0), ('5', 0.5, 64.5, 5.661817999999999, 47.404264999999995, 0.0), ('6', 0.5, 80.5, 5.455087999999999, 47.456436, 0.0), ('7', 0.5, 96.5, 5.247959, 47.508236000000004, 0.0), ('8', 0.5, 112.5, 5.04043, 47.559663, 0.0), ('9', 0.5, 128.5, 4.8324869999999995, 47.61071, 0.0), ('10', 0.5, 144.5, 4.624124, 47.66137499999999, 0.0), ] for r, v in zip(ref, gcp_values): for i, ri in enumerate(r): if float(ri) != pytest.approx(float(v[i]), abs=1e-10): print(r) pytest.fail('Wrong GCP coordinates.') gdalautotest-3.2.2/gdrivers/ntv2.py0000775000175000017500000001344314020414367015775 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ntv2.py eeafce698a5106167c026565a4795b437576c187 2020-05-10 14:47:33 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: NTv2 Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Open a little-endian NTv2 grid def test_ntv2_1(): tst = gdaltest.GDALTest('NTV2', 'ntv2/test_ntv2_le.gsb', 2, 10) gt = (-5.52, 7.8, 0.0, 52.05, 0.0, -5.55) return tst.testOpen(check_gt=gt, check_prj='WGS84') ############################################################################### # Open a big-endian NTv2 grid def test_ntv2_2(): tst = gdaltest.GDALTest('NTV2', 'ntv2/test_ntv2_be.gsb', 2, 10) gt = (-5.52, 7.8, 0.0, 52.05, 0.0, -5.55) return tst.testOpen(check_gt=gt, check_prj='WGS84') ############################################################################### # Test creating a little-endian NTv2 grid def test_ntv2_3(): tst = gdaltest.GDALTest('NTV2', 'ntv2/test_ntv2_le.gsb', 2, 10, options=['ENDIANNESS=LE']) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test creating a big-endian NTv2 grid def test_ntv2_4(): tst = gdaltest.GDALTest('NTV2', 'ntv2/test_ntv2_le.gsb', 2, 10, options=['ENDIANNESS=BE']) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test appending to a little-endian NTv2 grid def test_ntv2_5(): src_ds = gdal.Open('data/ntv2/test_ntv2_le.gsb') gdal.GetDriverByName('NTv2').Create('/vsimem/ntv2_5.gsb', 1, 1, 4, gdal.GDT_Float32, options=['ENDIANNESS=LE']) ds = gdal.GetDriverByName('NTv2').CreateCopy('/vsimem/ntv2_5.gsb', src_ds, options=['APPEND_SUBDATASET=YES']) assert ds.GetRasterBand(2).Checksum() == 10 ds = None ds = gdal.Open('NTv2:1:/vsimem/ntv2_5.gsb') assert ds.GetRasterBand(2).Checksum() == 10 ds = None gdal.GetDriverByName('NTv2').Delete('/vsimem/ntv2_5.gsb') ############################################################################### # Test appending to a big-endian NTv2 grid def test_ntv2_6(): src_ds = gdal.Open('data/ntv2/test_ntv2_le.gsb') gdal.GetDriverByName('NTv2').Create('/vsimem/ntv2_6.gsb', 1, 1, 4, gdal.GDT_Float32, options=['ENDIANNESS=BE']) ds = gdal.GetDriverByName('NTv2').CreateCopy('/vsimem/ntv2_6.gsb', src_ds, options=['APPEND_SUBDATASET=YES']) assert ds.GetRasterBand(2).Checksum() == 10 ds = None ds = gdal.Open('NTv2:1:/vsimem/ntv2_6.gsb') assert ds.GetRasterBand(2).Checksum() == 10 ds = None gdal.GetDriverByName('NTv2').Delete('/vsimem/ntv2_6.gsb') ############################################################################### # Test creating a file with invalid filename def test_ntv2_7(): with gdaltest.error_handler(): ds = gdal.GetDriverByName('NTv2').Create('/does/not/exist.gsb', 1, 1, 4, gdal.GDT_Float32) assert ds is None with gdaltest.error_handler(): ds = gdal.GetDriverByName('NTv2').Create('/does/not/exist.gsb', 1, 1, 4, gdal.GDT_Float32, options=['APPEND_SUBDATASET=YES']) assert ds is None ############################################################################### def test_ntv2_online_1(): if not gdaltest.download_file('http://download.osgeo.org/proj/nzgd2kgrid0005.gsb', 'nzgd2kgrid0005.gsb'): pytest.skip() try: os.stat('tmp/cache/nzgd2kgrid0005.gsb') except OSError: pytest.skip() tst = gdaltest.GDALTest('NTV2', 'tmp/cache/nzgd2kgrid0005.gsb', 1, 54971, filename_absolute=1) gt = (165.95, 0.1, 0.0, -33.95, 0.0, -0.1) return tst.testOpen(check_gt=gt, check_prj='WGS84') ############################################################################### def test_ntv2_online_2(): try: os.stat('tmp/cache/nzgd2kgrid0005.gsb') except OSError: pytest.skip() tst = gdaltest.GDALTest('NTV2', 'tmp/cache/nzgd2kgrid0005.gsb', 1, 54971, filename_absolute=1) return tst.testCreateCopy(vsimem=1) ############################################################################### def test_ntv2_online_3(): try: os.stat('tmp/cache/nzgd2kgrid0005.gsb') except OSError: pytest.skip() tst = gdaltest.GDALTest('NTV2', 'tmp/cache/nzgd2kgrid0005.gsb', 1, 54971, filename_absolute=1) return tst.testCreate(vsimem=1, out_bands=4) gdalautotest-3.2.2/gdrivers/prf.py0000775000175000017500000000641014020414367015667 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # Purpose: Tests for Racurs PHOTOMOD tiled format reader (http://www.racurs.ru) # Author: Andrew Sudorgin (drons [a] list dot ru) ############################################################################### # Copyright (c) 2016, Andrew Sudorgin # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest from osgeo import gdal import pytest ############################################################################### def test_prf_1(): tst = gdaltest.GDALTest('prf', './PRF/ph.prf', 1, 43190) return tst.testOpen(check_gt=(1, 2, 3, -7, 5, 6)) def test_prf_2(): ds = gdal.Open('./data/PRF/dem.x-dem') assert ds.RasterXSize == 4330, 'Invalid dataset width' assert ds.RasterYSize == 4663, 'Invalid dataset height' unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == 'm', 'Failed to read elevation units from x-dem' datatype = ds.GetRasterBand(1).DataType assert datatype == gdal.GDT_Float32, 'Failed to read datatype' expectedOvCount = 1 if ds.GetRasterBand(1).GetOverviewCount() != expectedOvCount: print('Overview count must be %d' % expectedOvCount) print('But GetOverviewCount returned %d' % ds.GetRasterBand(1).GetOverviewCount()) pytest.fail('did not get expected number of overviews') overview = ds.GetRasterBand(1).GetOverview(0) assert overview.XSize == 1082, ('Invalid dataset width %d' % overview.XSize) assert overview.YSize == 1165, ('Invalid dataset height %d' % overview.YSize) ds = None def test_prf_3(): ds = gdal.Open('./data/PRF/ph.prf') expectedOvCount = 0 if ds.GetRasterBand(1).GetOverviewCount() != expectedOvCount: print('Overview count must be %d' % expectedOvCount) print('But GetOverviewCount returned %d' % ds.GetRasterBand(1).GetOverviewCount()) pytest.fail('did not get expected number of overviews') ds = None def test_prf_4(): tst = gdaltest.GDALTest('prf', './PRF/dem.x-dem', 1, 0) return tst.testOpen(check_gt=(1.5, 1.0, 0.0, 9329.0, 0.0, -2.0)) ############################################################################### gdalautotest-3.2.2/gdrivers/test_validate_jp2.py0000775000175000017500000004371714020414367020516 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_validate_jp2.py fbe236ed0a68ff89ae1d2b8bf47c8e83437882f9 2020-06-03 21:52:21 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test validate_jp2 script # Author: Even Rouault # ############################################################################### # Copyright (c) 2015, European Union (European Environment Agency) # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import sys from osgeo import gdal import pytest import gdaltest ############################################################################### # Verify we have the JP2OpenJPEG driver. def test_validate_jp2_1(): gdaltest.has_validate_jp2_and_build_jp2 = False gdaltest.jp2openjpeg_drv = gdal.GetDriverByName('JP2OpenJPEG') if gdaltest.jp2openjpeg_drv is None: pytest.skip() path = '../../gdal/swig/python/samples' if path not in sys.path: sys.path.append(path) try: import validate_jp2 import build_jp2_from_xml validate_jp2.validate build_jp2_from_xml.build_file except (ImportError, AttributeError): pytest.skip() gdaltest.has_validate_jp2_and_build_jp2 = True gdaltest.deregister_all_jpeg2000_drivers_but('JP2OpenJPEG') ############################################################################### def validate(filename, inspire_tg=True, expected_gmljp2=True, oidoc=None): try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET') ogc_schemas_location = 'tmp/cache/SCHEMAS_OPENGIS_NET' except OSError: ogc_schemas_location = 'disabled' if ogc_schemas_location != 'disabled': try: import xmlvalidate xmlvalidate.validate # to make pyflakes happy except (ImportError, AttributeError): ogc_schemas_location = 'disabled' path = '../../gdal/swig/python/samples' if path not in sys.path: sys.path.append(path) import validate_jp2 error_report = validate_jp2.ErrorReport(collect_internally=True) return validate_jp2.validate(filename, oidoc, inspire_tg, expected_gmljp2, ogc_schemas_location, error_report=error_report) ############################################################################### # Highly corrupted file def test_validate_jp2_2(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() import build_jp2_from_xml build_jp2_from_xml.build_file('data/test_validate_jp2/byte_corrupted.xml', '/vsimem/out.jp2') error_report = validate('/vsimem/out.jp2', oidoc='data/test_validate_jp2/byte_oi.xml') gdal.Unlink('/vsimem/out.jp2') expected_errors = ['ERROR[GeoJP2]: 2 GeoTIFF UUID box found', 'ERROR[GeoJP2]: GeoTIFF should have width of 1 pixel, not 2', 'ERROR[GeoJP2]: GeoTIFF should have height of 1 pixel, not 2', 'ERROR[GENERAL]: Inconsistent geotransform between GeoJP2 ((440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)) and GMLJP2 ((-440780.0, 60.0, 0.0, -3751260.0, 0.0, -60.0))', 'ERROR[GENERAL]: Inconsistent SRS between GeoJP2 (wkt=PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]], proj4=+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs) and GMLJP2 (wkt=PROJCS["WGS 84 / UTM zone 31N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32631"]], proj4=+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs)', 'ERROR[GENERAL]: ftyp.BR = "XXXX" instead of "jp2 "', 'ERROR[GENERAL]: ftyp.MinV = "1" instead of 0', 'ERROR[INSPIRE_TG]: "jpx " not found in compatibility list of ftyp, but GMLJP2 box present', 'ERROR[INSPIRE_TG]: "rreq" box does not advertise standard flag 67 whereas GMLJP2 box is present', 'ERROR[GENERAL]: ihdr.C = 6 instead of 7', 'ERROR[GENERAL]: ihdr.UnkC = 2 instead of 0 or 1', 'ERROR[GENERAL]: "ihdr" box expected to be found zero or one time, but present 2 times', 'ERROR[INSPIRE_TG, Requirement 23, Conformance class A.8.15]: "jp2c" box expected to be found one time, but present 2 times', 'ERROR[GENERAL]: "ftyp" box expected to be found zero or one time, but present 2 times', 'ERROR[INSPIRE_TG, Requirement 21]: SIZ.Rsiz=0 found but 2 (Profile 1) expected', 'ERROR[GENERAL]: ihdr_width(=21) != Xsiz (=20)- XOsiz(=0)', 'ERROR[GENERAL]: ihdr_height(=19) != Ysiz(=20) - YOsiz(=0)', 'ERROR[GENERAL]: ihdr_nc(=1) != Csiz (=2)', 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[0]=6 (unsigned 7 bits), which is not allowed', 'ERROR[GENERAL]: SIZ.Ssiz[0]=6, whereas bpcc[0]=7', 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[1]=6 (unsigned 7 bits), which is not allowed', 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.low[x] != XOsiz', 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.low[y] != YOsiz', 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.high[x] != Xsiz - 1', 'ERROR[GMLJP2]: RectifiedGrid.limits.GridEnvelope.high[y] != Ysiz - 1', 'ERROR[INSPIRE_TG, Conformance class A.8.6]: count(OrthoImageryCoverage.rangeType.field)(=1) != Csiz(=2) ', 'ERROR[PROFILE_1, Conformance class A.8.14]: SPcod_xcb_minus_2 = 5, whereas max allowed for Profile 1 is 4'] if set(error_report.error_array) != set(expected_errors): import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) pytest.fail('did not get expected errors') expected_warnings = [ 'WARNING[GENERAL]: Unknown value 1 for colr.PREC', 'WARNING[GENERAL]: Unknown value 1 for colr.APPROX', 'WARNING[GENERAL]: Unknown value 1 for colr.EnumCS', 'WARNING[GENERAL]: ihdr.ipr = 1 but no jp2i box found', 'WARNING[INSPIRE_TG]: "asoc" box not at expected index', 'WARNING[INSPIRE_TG]: "uuid" box not at expected index', 'WARNING[INSPIRE_TG, Recommendation 39]: No user-defined precincts 0 defined' ] if set(error_report.warning_array) != set(expected_warnings): import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) pytest.fail('did not get expected errors') ############################################################################### # Another highly corrupted file def test_validate_jp2_3(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() import build_jp2_from_xml build_jp2_from_xml.build_file('data/test_validate_jp2/stefan_full_rgba_corrupted.xml', '/vsimem/out.jp2') gdal.PushErrorHandler() error_report = validate('/vsimem/out.jp2', oidoc='data/test_validate_jp2/stefan_full_rgba_oi.xml') gdal.PopErrorHandler() gdal.Unlink('/vsimem/out.jp2') expected_errors = ['ERROR[GMLJP2]: No GMLJP2 box found whereas it was expected', 'ERROR[GENERAL]: cdef.N = 5 whereas ihdr.nc = 4', 'ERROR[GENERAL]: cdef.cn[2] = 4 is invalid', 'ERROR[GENERAL]: cdef.cn[4] = 3 is invalid since already used', 'ERROR[GENERAL]: cdef.typ[4] = 1 is invalid since another alpha channel has already been defined', 'ERROR[GENERAL]: cdef.asoc[4] = 0 is invalid since another band has already been associated to whole image', 'ERROR[PROFILE_1, Conformance class A.8.14]: Xsiz = 2200000162, whereas only 31 bits are allowed for Profile 1', 'ERROR[PROFILE_1, Conformance class A.8.14]: Ysiz = 2200000150, whereas only 31 bits are allowed for Profile 1', 'ERROR[PROFILE_1, Conformance class A.8.14]: XOsiz = 2200000000, whereas only 31 bits are allowed for Profile 1', 'ERROR[PROFILE_1, Conformance class A.8.14]: YOsiz = 2200000000, whereas only 31 bits are allowed for Profile 1', 'ERROR[GENERAL]: ihdr_nc(=4) != Csiz (=5)', 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[3]=2 (unsigned 3 bits), which is not allowed', 'ERROR[GENERAL]: SIZ.Ssiz[3]=2, whereas bpcc[3]=7', 'ERROR[INSPIRE_TG, Requirement 24, Conformance class A.8.9]: SIZ.Ssiz[4]=2 (unsigned 3 bits), which is not allowed', 'ERROR[PROFILE_1, Conformance class A.8.14]: XTsiz / min_XYRSiz = 2200000062.000000 > 1024', 'ERROR[PROFILE_1, Conformance class A.8.14]: XTsiz (=2200000062) != YTsiz (=2200000050)', 'ERROR[INSPIRE_TG]: Cannot find RectifiedGrid in OrthoImageryCoverage', 'ERROR[INSPIRE_TG, Conformance class A.8.6]: count(OrthoImageryCoverage.rangeType.field)(=4) != Csiz(=5) ', 'ERROR[PROFILE_1, Conformance class A.8.14]: Not enough decomposition levels = 0 (max_dim=162, 128 * 2**SPcod_NumDecompositions=128)'] if error_report.error_array != expected_errors: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) pytest.fail('did not get expected errors') expected_warnings = [ 'WARNING[INSPIRE_TG, Recommendation 38]: Bit depth of alpha channel should be 1 (BPCC 0), but its BPCC is 7', 'WARNING[INSPIRE_TG, Recommendation 38]: Bit depth of alpha channel should be 1 (BPCC 0), but its BPCC is 7' ] if error_report.warning_array != expected_warnings: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) pytest.fail('did not get expected errors') ############################################################################### # Another highly corrupted file def test_validate_jp2_4(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() import build_jp2_from_xml build_jp2_from_xml.build_file('data/test_validate_jp2/almost_nojp2box.xml', '/vsimem/out.jp2') gdal.PushErrorHandler() error_report = validate('/vsimem/out.jp2', expected_gmljp2=False) gdal.PopErrorHandler() gdal.Unlink('/vsimem/out.jp2') expected_errors = [ 'ERROR[GENERAL]: "ftyp" box not found', 'ERROR[GENERAL]: "jp2h" box not found', 'ERROR[GENERAL]: No SIZ marker found', 'ERROR[GENERAL]: No COD marker found', 'ERROR[GENERAL]: No QCD marker found', 'ERROR[GENERAL]: No SOT marker found', 'ERROR[GENERAL]: No EOC marker found'] if error_report.error_array != expected_errors: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) pytest.fail('did not get expected errors') expected_warnings = [ ] if error_report.warning_array != expected_warnings: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) pytest.fail('did not get expected errors') ############################################################################### # Slightly less corrupted file. Test mainly issues with JP2boxes and color table # Also a RGN marker def test_validate_jp2_5(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() import build_jp2_from_xml build_jp2_from_xml.build_file('data/test_validate_jp2/utmsmall_pct_corrupted.xml', '/vsimem/out.jp2') gdal.PushErrorHandler() error_report = validate('/vsimem/out.jp2', oidoc='data/test_validate_jp2/utmsmall_pct_oi.xml') gdal.PopErrorHandler() gdal.Unlink('/vsimem/out.jp2') expected_errors = [ 'ERROR[INSPIRE_TG]: "jpx " not found in compatibility list of ftyp, but GMLJP2 box present', 'ERROR[INSPIRE_TG]: "rreq" box not found, but GMLJP2 box present', 'ERROR[INSPIRE_TG]: pclr box found but ihdr.nc = 2', 'ERROR[INSPIRE_TG, Conformance class A.8.6]: pclr.NPC(=4) != 3 (for color table)', 'ERROR[INSPIRE_TG]: cmap.MTYP[1] = 0 is invalid', 'ERROR[GENERAL]: cmap.CMP[2] = 2 is invalid', 'ERROR[GENERAL]: cmap.PCOL[2] = 0 is invalid since already used', 'ERROR[GENERAL]: ihdr_nc(=2) != Csiz (=1)', 'ERROR[INSPIRE_TG, Conformance class A.8.8]: Inconsistent geotransform between OrthoImagery ((440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)) and GMLJP2/GeoJP2 ((40720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0))', 'ERROR[INSPIRE_TG, Requirement 26, Conformance class A.8.16]: RGN marker found, which is not allowed'] if error_report.error_array != expected_errors: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) pytest.fail('did not get expected errors') expected_warnings = [ ] if error_report.warning_array != expected_warnings: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) pytest.fail('did not get expected errors') ############################################################################### # Nominal case with single band data def test_validate_jp2_6(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() error_report = validate('data/test_validate_jp2/byte.jp2', oidoc='data/test_validate_jp2/byte_oi.xml') gdal.Unlink('/vsimem/out.jp2') expected_errors = [] if error_report.error_array != expected_errors: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) pytest.fail('did not get expected errors') expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) pytest.fail('did not get expected errors') ############################################################################### # Nominal case with RGBA data def test_validate_jp2_7(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() error_report = validate('data/test_validate_jp2/stefan_full_rgba.jp2', oidoc='data/test_validate_jp2/stefan_full_rgba_oi.xml', expected_gmljp2=False) gdal.Unlink('/vsimem/out.jp2') expected_errors = [] if error_report.error_array != expected_errors: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) pytest.fail('did not get expected errors') expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) pytest.fail('did not get expected errors') ############################################################################### # Nominal case with color table data def test_validate_jp2_8(): if not gdaltest.has_validate_jp2_and_build_jp2: pytest.skip() error_report = validate('data/test_validate_jp2/utmsmall_pct.jp2', oidoc='data/test_validate_jp2/utmsmall_pct_oi.xml') gdal.Unlink('/vsimem/out.jp2') expected_errors = [] if error_report.error_array != expected_errors: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.error_array) pytest.fail('did not get expected errors') expected_warnings = [] if error_report.warning_array != expected_warnings: import pprint pp = pprint.PrettyPrinter() pp.pprint(error_report.warning_array) pytest.fail('did not get expected errors') ############################################################################### def test_validate_jp2_cleanup(): if gdaltest.has_validate_jp2_and_build_jp2: gdaltest.reregister_all_jpeg2000_drivers() gdalautotest-3.2.2/gdrivers/srtmhgt.py0000775000175000017500000001212314020414367016566 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: srtmhgt.py b1c9c12ad373e40b955162b45d704070d4ebf7b0 2019-06-19 16:50:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test SRTMHGT support. # Author: Even Rouault < even dot rouault @ spatialys.com > # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # Copyright (c) 2008-2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import pytest ############################################################################### # Test a SRTMHGT Level 1 (made from a DTED Level 0) def test_srtmhgt_1(): ds = gdal.Open('data/n43.dt0') bandSrc = ds.GetRasterBand(1) driver = gdal.GetDriverByName("GTiff") dsDst = driver.Create('tmp/n43.dt1.tif', 1201, 1201, 1, gdal.GDT_Int16) dsDst.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]') dsDst.SetGeoTransform((-80.0004166666666663, 0.0008333333333333, 0, 44.0004166666666670, 0, -0.0008333333333333)) bandDst = dsDst.GetRasterBand(1) data = bandSrc.ReadRaster(0, 0, 121, 121, 1201, 1201, gdal.GDT_Int16) bandDst.WriteRaster(0, 0, 1201, 1201, data, 1201, 1201, gdal.GDT_Int16) bandDst.FlushCache() bandDst = None ds = None dsDst = None ds = gdal.Open('tmp/n43.dt1.tif') driver = gdal.GetDriverByName("SRTMHGT") dsDst = driver.CreateCopy('tmp/n43w080.hgt', ds) band = dsDst.GetRasterBand(1) chksum = band.Checksum() assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) ############################################################################### # Test creating an in memory copy. def test_srtmhgt_2(): ds = gdal.Open('tmp/n43w080.hgt') driver = gdal.GetDriverByName("SRTMHGT") dsDst = driver.CreateCopy('/vsimem/n43w080.hgt', ds) band = dsDst.GetRasterBand(1) chksum = band.Checksum() assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) dsDst = None # Test update support dsDst = gdal.Open('/vsimem/n43w080.hgt', gdal.GA_Update) dsDst.WriteRaster(0, 0, dsDst.RasterXSize, dsDst.RasterYSize, dsDst.ReadRaster()) dsDst.FlushCache() assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) dsDst = None ############################################################################### # Test reading from a .hgt.zip file def test_srtmhgt_3(): ds = gdal.Open('tmp/n43w080.hgt') driver = gdal.GetDriverByName("SRTMHGT") driver.CreateCopy('/vsizip//vsimem/N43W080.SRTMGL1.hgt.zip/N43W080.hgt', ds) dsDst = gdal.Open('/vsimem/N43W080.SRTMGL1.hgt.zip') band = dsDst.GetRasterBand(1) chksum = band.Checksum() assert chksum == 60918, ('Wrong checksum. Checksum found %d' % chksum) ############################################################################### # Test reading from a .SRTMSWBD.raw.zip file (GRASS #3246) def test_srtmhgt_4(): f = gdal.VSIFOpenL('/vsizip//vsimem/N43W080.SRTMSWBD.raw.zip/N43W080.raw', 'wb') if f is None: pytest.skip() gdal.VSIFWriteL(' ' * (3601 * 3601), 1, 3601 * 3601, f) gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/N43W080.SRTMSWBD.raw.zip') assert ds is not None cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('/vsimem/N43W080.SRTMSWBD.raw.zip') assert cs == 3636, ('Wrong checksum. Checksum found %d' % cs) ############################################################################### # Cleanup. def test_srtmhgt_cleanup(): try: gdal.GetDriverByName("SRTMHGT").Delete('tmp/n43w080.hgt') gdal.GetDriverByName("SRTMHGT").Delete('/vsimem/n43w080.hgt') gdal.Unlink('/vsimem/N43W080.SRTMGL1.hgt.zip') os.remove('tmp/n43.dt1.tif') except (RuntimeError, OSError): pass gdalautotest-3.2.2/gdrivers/jpegls.py0000775000175000017500000000425714020414367016373 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: jpegls.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: JPEGLS Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### def test_jpegls_1(): if gdal.GetDriverByName('JPEGLS') is None: pytest.skip() tst = gdaltest.GDALTest('JPEGLS', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### def test_jpegls_2(): if gdal.GetDriverByName('JPEGLS') is None: pytest.skip() tst = gdaltest.GDALTest('JPEGLS', 'int16.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) gdalautotest-3.2.2/gdrivers/xmp.py0000775000175000017500000001057714020414367015715 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: xmp.py 2bc7569d59917136aaf50860b2046d9589faee68 2020-05-10 20:48:09 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test XMP metadata reading. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2011-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest from osgeo import gdal import gdaltest ############################################################################### # lst = [ ["GTiff", "data/gtiff/byte_with_xmp.tif", True], ["GTiff", "data/byte.tif", False], ["GIF", "data/gif/byte_with_xmp.gif", True], ["BIGGIF", "data/gif/fakebig.gif", False], ["JPEG", "data/jpeg/byte_with_xmp.jpg", True], ["JPEG", "data/jpeg/rgbsmall_rgb.jpg", False], ["PNG", "data/png/byte_with_xmp.png", True], ["PNG", "data/png/test.png", False], ["JP2ECW", "data/jpeg2000/byte_with_xmp.jp2", True], ["JP2ECW", "data/jpeg2000/byte.jp2", False], ["JP2MrSID", "data/jpeg2000/byte_with_xmp.jp2", True], ["JP2MrSID", "data/jpeg2000/byte.jp2", False], ["JPEG2000", "data/jpeg2000/byte_with_xmp.jp2", True], ["JPEG2000", "data/jpeg2000/byte.jp2", False], ["JP2OpenJPEG", "data/jpeg2000/byte_with_xmp.jp2", True], ["JP2OpenJPEG", "data/jpeg2000/byte.jp2", False], ["JP2KAK", "data/jpeg2000/byte_with_xmp.jp2", True], ["JP2KAK", "data/jpeg2000/byte.jp2", False], ["PDF", "data/pdf/adobe_style_geospatial_with_xmp.pdf", True], ["PDF", "data/pdf/adobe_style_geospatial.pdf", False], ["WEBP", "data/webp/rgbsmall_with_xmp.webp", True], ["WEBP", "data/webp/rgbsmall.webp", False], ] @pytest.mark.parametrize( 'drivername,filename,expect_xmp', lst, ids=[ "xmp_read_%s_%s" % (drivername, str(expect_xmp)) for (drivername, filename, expect_xmp) in lst ] ) def test_xmp(drivername, filename, expect_xmp): drv = gdal.GetDriverByName(drivername) if drv is None: pytest.skip() if drivername == 'PDF': md = drv.GetMetadata() if 'HAVE_POPPLER' not in md and 'HAVE_PODOFO' not in md: pytest.skip() # we set ECW to not resolve projection and datum strings to get 3.x behavior. gdal.SetConfigOption("ECW_DO_NOT_RESOLVE_DATUM_PROJECTION", "YES") if '.jp2' in filename: gdaltest.deregister_all_jpeg2000_drivers_but(drivername) try: ds = gdal.Open(filename) if filename == 'data/rgbsmall_with_xmp.webp': if ds is None: pytest.skip("Old libwebp don't support VP8X containers") else: assert ds is not None, 'open failed' xmp_md = ds.GetMetadata('xml:XMP') assert ds.GetDriver().ShortName == drivername, 'opened with wrong driver' assert not (expect_xmp and not xmp_md), 'did not find xml:XMP metadata' assert not (expect_xmp and 'xml:XMP' not in ds.GetMetadataDomainList()), 'did not find xml:XMP metadata domain' assert expect_xmp or not xmp_md, 'found unexpected xml:XMP metadata' ds = None finally: if '.jp2' in filename: gdaltest.reregister_all_jpeg2000_drivers() gdalautotest-3.2.2/gdrivers/aaigrid.py0000775000175000017500000003075414020414367016510 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: aaigrid.py 01669b3b17aa5e950d2c91b2e122369a66f40446 2020-05-10 17:37:29 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Arc/Info ASCII Grid support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # Copyright (c) 2008-2010, Even Rouault # Copyright (c) 2014, Kyle Shannon # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Perform simple read test. def test_aaigrid_1(): tst = gdaltest.GDALTest('aaigrid', 'aaigrid/pixel_per_line.asc', 1, 1123) return tst.testOpen() ############################################################################### # Verify some auxiliary data. def test_aaigrid_2(): ds = gdal.Open('data/aaigrid/pixel_per_line.asc') gt = ds.GetGeoTransform() assert gt[0] == 100000.0 and gt[1] == 50 and gt[2] == 0 and gt[3] == 650600.0 and gt[4] == 0 and gt[5] == -50, \ 'Aaigrid geotransform wrong.' prj = ds.GetProjection() assert prj == 'PROJCS["unnamed",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",59],PARAMETER["longitude_of_center",-132.5],PARAMETER["standard_parallel_1",61.6666666666667],PARAMETER["standard_parallel_2",68],PARAMETER["false_easting",500000],PARAMETER["false_northing",500000],UNIT["METERS",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]', \ ('Projection does not match expected:\n%s' % prj) band1 = ds.GetRasterBand(1) assert band1.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' assert band1.DataType == gdal.GDT_Float32, 'Data type is not Float32!' ############################################################################### # Test reading a file where decimal separator is comma (#3668) def test_aaigrid_comma(): ds = gdal.Open('data/aaigrid/pixel_per_line_comma.asc') gt = ds.GetGeoTransform() assert gt[0] == 100000.0 and gt[1] == 50 and gt[2] == 0 and gt[3] == 650600.0 and gt[4] == 0 and gt[5] == -50, \ 'Aaigrid geotransform wrong.' band1 = ds.GetRasterBand(1) assert band1.Checksum() == 1123, 'Did not get expected nodata value.' assert band1.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' assert band1.DataType == gdal.GDT_Float32, 'Data type is not Float32!' ############################################################################### # Create simple copy and check. def test_aaigrid_3(): tst = gdaltest.GDALTest('AAIGRID', 'byte.tif', 1, 4672) prj = 'PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]' return tst.testCreateCopy(check_gt=1, check_srs=prj) ############################################################################### # Read subwindow. Tests the tail recursion problem. def test_aaigrid_4(): tst = gdaltest.GDALTest('aaigrid', 'aaigrid/pixel_per_line.asc', 1, 187, 5, 5, 5, 5) return tst.testOpen() ############################################################################### # Perform simple read test on mixed-case .PRJ filename def test_aaigrid_5(): # Mixed-case files pair used in the test: # - case_sensitive.ASC # - case_sensitive.PRJ tst = gdaltest.GDALTest('aaigrid', 'aaigrid/case_sensitive.ASC', 1, 1123) prj = """PROJCS["unnamed", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6269"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4269"]], PROJECTION["Albers_Conic_Equal_Area"], PARAMETER["standard_parallel_1",61.66666666666666], PARAMETER["standard_parallel_2",68], PARAMETER["latitude_of_center",59], PARAMETER["longitude_of_center",-132.5], PARAMETER["false_easting",500000], PARAMETER["false_northing",500000], UNIT["METERS",1]] """ return tst.testOpen(check_prj=prj) ############################################################################### # Verify data type determination from type of nodata def test_aaigrid_6(): ds = gdal.Open('data/aaigrid/nodata_float.asc') b = ds.GetRasterBand(1) assert b.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' assert b.DataType == gdal.GDT_Float32, 'Data type is not Float32!' ############################################################################### # Verify data type determination from type of nodata def test_aaigrid_6bis(): ds = gdal.Open('data/aaigrid/nodata_int.asc') b = ds.GetRasterBand(1) assert b.GetNoDataValue() == -99999, 'Grid NODATA value wrong or missing.' assert b.DataType == gdal.GDT_Int32, 'Data type is not Int32!' ############################################################################### # Verify writing files with non-square pixels. def test_aaigrid_7(): tst = gdaltest.GDALTest('AAIGRID', 'aaigrid/nonsquare.vrt', 1, 12481) return tst.testCreateCopy(check_gt=1) ############################################################################### # Test creating an in memory copy. def test_aaigrid_8(): tst = gdaltest.GDALTest('AAIGRID', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test DECIMAL_PRECISION creation option def test_aaigrid_9(): ds = gdal.Open('data/ehdr/float32.bil') ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, options=['DECIMAL_PRECISION=2']) got_minmax = ds2.GetRasterBand(1).ComputeRasterMinMax() ds2 = None gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') if got_minmax[0] == pytest.approx(-0.84, abs=1e-7): return pytest.fail() ############################################################################### # Test AAIGRID_DATATYPE configuration option and DATATYPE open options def test_aaigrid_10(): # By default detected as 32bit float ds = gdal.Open('data/aaigrid/float64.asc') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32, 'Data type is not Float32!' for i in range(2): try: os.remove('data/aaigrid/float64.asc.aux.xml') except OSError: pass if i == 0: gdal.SetConfigOption('AAIGRID_DATATYPE', 'Float64') ds = gdal.Open('data/aaigrid/float64.asc') gdal.SetConfigOption('AAIGRID_DATATYPE', None) else: ds = gdal.OpenEx('data/aaigrid/float64.asc', open_options=['DATATYPE=Float64']) assert ds.GetRasterBand(1).DataType == gdal.GDT_Float64, 'Data type is not Float64!' nv = ds.GetRasterBand(1).GetNoDataValue() assert nv == pytest.approx(-1.234567890123, abs=1e-16), 'did not get expected nodata value' got_minmax = ds.GetRasterBand(1).ComputeRasterMinMax() assert got_minmax[0] == pytest.approx(1.234567890123, abs=1e-16), \ 'did not get expected min value' assert got_minmax[1] == pytest.approx(1.234567890123, abs=1e-16), \ 'did not get expected max value' try: os.remove('data/aaigrid/float64.asc.aux.xml') except OSError: pass ############################################################################### # Test SIGNIFICANT_DIGITS creation option (same as DECIMAL_PRECISION test) def test_aaigrid_11(): ds = gdal.Open('data/ehdr/float32.bil') ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, options=['SIGNIFICANT_DIGITS=2']) got_minmax = ds2.GetRasterBand(1).ComputeRasterMinMax() ds2 = None gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') if got_minmax[0] == pytest.approx(-0.84, abs=1e-7): return pytest.fail() ############################################################################### # Test no data is written to correct precision with DECIMAL_PRECISION. def test_aaigrid_12(): ds = gdal.Open('data/aaigrid/nodata_float.asc') ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, options=['DECIMAL_PRECISION=3']) del ds2 aai = open('tmp/aaigrid.tmp') assert aai for _ in range(5): aai.readline() ndv = aai.readline().strip().lower() aai.close() gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') assert ndv.startswith('nodata_value') assert ndv.endswith('-99999.000') ############################################################################### # Test no data is written to correct precision WITH SIGNIFICANT_DIGITS. def test_aaigrid_13(): ds = gdal.Open('data/aaigrid/nodata_float.asc') ds2 = gdal.GetDriverByName('AAIGRID').CreateCopy('tmp/aaigrid.tmp', ds, options=['SIGNIFICANT_DIGITS=3']) del ds2 aai = open('tmp/aaigrid.tmp') assert aai for _ in range(5): aai.readline() ndv = aai.readline().strip().lower() aai.close() gdal.GetDriverByName('AAIGRID').Delete('tmp/aaigrid.tmp') assert ndv.startswith('nodata_value') assert ndv.endswith('-1e+05') or ndv.endswith('-1e+005') ############################################################################### # Test fix for #6060 def test_aaigrid_14(): ds = gdal.Open('data/byte.tif') mem_ds = gdal.GetDriverByName('MEM').Create('', 20, 20, 1, gdal.GDT_Float32) mem_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, ds.ReadRaster(0, 0, 20, 20, buf_type=gdal.GDT_Float32)) ds = None gdal.GetDriverByName('AAIGRID').CreateCopy('/vsimem/aaigrid_14.asc', mem_ds) f = gdal.VSIFOpenL('/vsimem/aaigrid_14.asc', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.GetDriverByName('AAIGRID').Delete('/vsimem/aaigrid_14.asc') assert '107.0 123' in data ############################################################################### # Test Float64 detection when nodata = DBL_MIN def test_aaigrid_15(): gdal.FileFromMemBuffer('/vsimem/aaigrid_15.asc', """ncols 4 nrows 1 xllcorner 0 yllcorner -1 cellsize 1 NODATA_value 2.2250738585072014e-308 2.2250738585072014e-308 0 1 2.3e-308 """) ds = gdal.Open('/vsimem/aaigrid_15.asc') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float64 ds = None gdal.Unlink('/vsimem/aaigrid_15.asc') ############################################################################### gdalautotest-3.2.2/gdrivers/generate_fits.py0000664000175000017500000002022314020414367017712 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: generate_fits.py ce76b70517d4785fdd87fa6fb71c631c21db6d8e 2020-09-14 12:43:11 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Generate FITS samples # Author: Even Rouault # ############################################################################### # Copyright (c) 2020, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import fitsio import os import numpy as np data_dir = os.path.join(os.path.dirname(__file__), 'data', 'fits') fitsio.write(os.path.join(data_dir, 'empty_primary_hdu.fits'), data=None, clobber=True) filename = os.path.join(data_dir, 'image_in_second_hdu.fits') with fitsio.FITS(filename,'rw',clobber=True) as fits: fits.write(data=None, header={'FOO': 'BAR', 'FOO2': 'BAR2'}, clobber=True) fits[-1].write_checksum() img = np.arange(2,dtype='B').reshape(2,1) fits.write(data=img, header={'FOO':'BAR_override', 'BAR':'BAZ'}) fits[-1].write_checksum() filename = os.path.join(data_dir, 'image_in_first_and_second_hdu.fits') with fitsio.FITS(filename,'rw',clobber=True) as fits: img = np.arange(2,dtype='B').reshape(2,1) fits.write(data=img, extname='FIRST_IMAGE') img = np.arange(3,dtype='B').reshape(3,1) fits.write(data=img) filename = os.path.join(data_dir, 'image_in_second_and_fourth_hdu_table_in_third.fits') with fitsio.FITS(filename,'rw',clobber=True) as fits: fits.write(data=None, header={'FOO': 'BAR'}) fits[-1].write_checksum() img = np.arange(2,dtype='B').reshape(2,1) fits.write(data=img, extname='FIRST_IMAGE') fits[-1].write_checksum() nrows=2 data = np.zeros(nrows, dtype=[('int','i4'),('double','f8')]) data['int'] = np.arange(nrows,dtype='i4') data['double'] = np.arange(nrows,dtype='f8') fits.write_table(data) img = np.arange(3,dtype='B').reshape(3,1) fits.write(data=img, extname='SECOND_IMAGE') fits[-1].write_checksum() from astropy.io import fits filename = os.path.join(data_dir, 'binary_table.fits') if os.path.exists(filename): os.unlink(filename) hdr = fits.Header() hdr['EXTNAME'] = 'MyTable' hdu = fits.BinTableHDU.from_columns([ fits.Column(name='B_scaled_integer', format='B',array=[0, 255, 3]), fits.Column(name='B_scaled', format='B',array=[0, 255]), fits.Column(name='I_scaled_integer', format='I',array=[-32768, 32767]), fits.Column(name='I_scaled', format='I',array=[-32768, 32767]), fits.Column(name='J_scaled_integer', format='J',array=[-2147483648, 2147483647]), fits.Column(name='J_scaled', format='J',array=[-2147483648, 2147483647]), fits.Column(name='K_scaled', format='K',array=[-9223372036854775808, 9223372036854775807]), fits.Column(name='E_scaled', format='E',array=[1.25, 2.25]), fits.Column(name='D_scaled', format='D',array=[1.25, 2.25]), fits.Column(name='C_scaled', format='C',array=[1.25 + 2.25j]), fits.Column(name='M_scaled', format='M',array=[1.25 + 2.25j]), fits.Column(name='L', format='L',array=[True, False]), fits.Column(name='2L', format='2L',array=[[True, False], [False, True]]), fits.Column(name='PL', format='PL()',array=[[True, False], [False, True, False], []]), fits.Column(name='QL', format='QL()',array=[[True, False], [False, True, False], []]), fits.Column(name='X', format='X',array=np.array([[1], [0]], dtype=np.uint8)), fits.Column(name='33X', format='33X',array=np.array([[1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1], [1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1]], dtype=np.uint8)), # PX doesn't seem to work fits.Column(name='B', format='B',array=[0, 255, 3],null=3), fits.Column(name='2B', format='2B',array=[[255,0], [0,255]]), fits.Column(name='PB', format='PB()',array=[[255,0], [0,255,0], []]), fits.Column(name='BDIM', format='6B',dim='(3,2)',array=[[[0,255,0], [255,0,255]], [[255,255,0], [0,0,255]]]), fits.Column(name='I', format='I',array=[-32768, 32767]), fits.Column(name='2I', format='2I',array=[[-32768, 32767], [32767, -32768]]), fits.Column(name='PI', format='PI()',array=[[-32768, 32767], [32767, 0, -32768], []]), fits.Column(name='J', format='J',array=[-2147483648, 2147483647]), fits.Column(name='2J', format='2J',array=[[-2147483648, 2147483647], [2147483647, -2147483648]]), fits.Column(name='PJ', format='PJ()',array=[[-2147483648, 2147483647], [2147483647, 0, -2147483648], []]), fits.Column(name='K', format='K',array=[-9223372036854775808, 9223372036854775807]), fits.Column(name='2K', format='2K',array=[[-9223372036854775808, 9223372036854775807], [9223372036854775807, -9223372036854775808]]), fits.Column(name='PK', format='PK()',array=[[-9223372036854775808, 9223372036854775807], [9223372036854775807, 0, -9223372036854775808], []]), fits.Column(name='A', format='A',array=["A", "B"]), fits.Column(name='A2', format='A2',array=["AB", "CD"]), fits.Column(name='PA', format='PA()',array=["AB", "CDE"]), fits.Column(name='ADIM', format='6A',dim='(2, 3)',array=[["AB", "ab", "Ab"], ["CD", "cd", "Cd"]]), fits.Column(name='E', format='E',array=[1.25, 2.25]), fits.Column(name='2E', format='2E',array=[[1.25, 2.25], [2.25, 1.25]]), fits.Column(name='PE', format='PE()',array=[[1.25, 2.25], [2.25, 1.25, 2.25],[]]), fits.Column(name='D', format='D',array=[1.2534, 2.25]), fits.Column(name='2D', format='2D',array=[[1.2534, 2.25], [2.2534, 1.25]]), fits.Column(name='PD', format='PD()',array=[[1.2534, 2.25], [2.2534, 1.25, 2.25],[]]), fits.Column(name='C', format='C',array=[1.25 + 2.25j, 2.25 + 1.25j]), fits.Column(name='2C', format='2C',array=[[1.25 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j]]), fits.Column(name='PC', format='PC',array=[[1.25 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j, 2.25 + 1.25j],[]]), fits.Column(name='M', format='M',array=[1.2534 + 2.25j, 2.25 + 1.25j]), fits.Column(name='2M', format='2M',array=[[1.2534 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j]]), fits.Column(name='PM', format='PM',array=[[1.2534 + 2.25j, 2.25 + 1.25j],[2.25 + 1.25j, 1.25 + 2.25j, 2.25 + 1.25j],[]]), ], header=hdr) hdu.writeto(filename) # Add back zero & scal info with fitsio, since there are some issues with # astropy for integer data types with fitsio.FITS(filename,'rw') as f: hdu = f[-1] hdu.write_key('TZERO1', -128) hdu.write_key('TSCAL2', 1.5) hdu.write_key('TZERO2', 2.5) hdu.write_key('TZERO3', 32768) hdu.write_key('TSCAL4', 1.5) hdu.write_key('TZERO4', 2.5) hdu.write_key('TZERO5', 2147483648) hdu.write_key('TSCAL6', 1.5) hdu.write_key('TZERO6', 2.5) hdu.write_key('TSCAL7', 1.5) hdu.write_key('TZERO7', 2.5) hdu.write_key('TSCAL8', 1.5) hdu.write_key('TZERO8', 2.5) hdu.write_key('TSCAL9', 1.5) hdu.write_key('TZERO9', 2.5) hdu.write_key('TSCAL10', 1.5) hdu.write_key('TZERO10', 2.5) hdu.write_key('TSCAL11', 1.5) hdu.write_key('TZERO11', 2.5) gdalautotest-3.2.2/gdrivers/dipex.py0000775000175000017500000000350614020414367016214 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: dipex.py 7262f20984690b0b98df92d508fc64875d0510cf 2020-05-10 15:49:44 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test DIPEx driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test a fake DIPex dataset def test_dipex_1(): tst = gdaltest.GDALTest('DIPEx', 'dipex/fakedipex.dat', 1, 1) return tst.testOpen() gdalautotest-3.2.2/gdrivers/heif.py0000664000175000017500000001261014020414367016007 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: heif.py 7c063a8bf7b97d6f351f896326d1f59b6a3c1366 2020-06-18 18:29:55 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test HEIF driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2020, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest import gdaltest from osgeo import gdal pytestmark = pytest.mark.require_driver('HEIF') def get_version(): return [int(x) for x in gdal.GetDriverByName('HEIF').GetMetadataItem('LIBHEIF_VERSION').split('.')] @pytest.mark.parametrize('endianness', ['big_endian', 'little_endian']) def test_heif_exif_endian(endianness): filename = 'data/heif/byte_exif_%s.heic' % endianness gdal.ErrorReset() ds = gdal.Open(filename) assert gdal.GetLastErrorMsg() == '' assert ds assert ds.RasterXSize == 64 assert ds.RasterYSize == 64 assert ds.RasterCount == 3 stats = ds.GetRasterBand(1).ComputeStatistics(False) assert stats[0] == pytest.approx(89, abs=2) assert stats[1] == pytest.approx(243, abs=2) assert stats[2] == pytest.approx(126.7, abs=0.5) assert stats[3] == pytest.approx(18.8, abs=0.5) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(1).GetOverviewCount() == 0 if get_version() >= [1, 4, 0]: assert 'EXIF' in ds.GetMetadataDomainList() assert 'xml:XMP' in ds.GetMetadataDomainList() assert len(ds.GetMetadata('EXIF')) > 0 assert 'xpacket' in ds.GetMetadata('xml:XMP')[0] ds = None gdal.Unlink(filename + '.aux.xml') def test_heif_thumbnail(): ds = gdal.Open('data/heif/byte_thumbnail.heic') assert ds assert ds.RasterXSize == 128 assert ds.RasterYSize == 128 assert ds.RasterCount == 3 assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(1) is None ovrband = ds.GetRasterBand(1).GetOverview(0) assert ovrband is not None assert ovrband.XSize == 64 assert ovrband.YSize == 64 assert ovrband.Checksum() != 0 def test_heif_rgb_16bit(): if get_version() < [1, 4, 0]: pytest.skip() ds = gdal.Open('data/heif/small_world_16.heic') assert ds assert ds.RasterXSize == 400 assert ds.RasterYSize == 200 assert ds.RasterCount == 3 assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '10' assert ds.GetRasterBand(1).ComputeRasterMinMax() == pytest.approx((0,1023), abs=2) def test_heif_rgba(): ds = gdal.Open('data/heif/stefan_full_rgba.heic') assert ds assert ds.RasterCount == 4 assert ds.RasterXSize == 162 assert ds.RasterYSize == 150 assert ds.GetRasterBand(1).GetOverviewCount() == 1 ovrband = ds.GetRasterBand(1).GetOverview(0) assert ovrband is not None assert ovrband.XSize == 96 assert ovrband.YSize == 88 assert ovrband.Checksum() != 0 def test_heif_rgba_16bit(): if get_version() < [1, 4, 0]: pytest.skip() ds = gdal.Open('data/heif/stefan_full_rgba_16.heic') assert ds assert ds.RasterCount == 4 assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 def test_heif_subdatasets(): ds = gdal.Open('data/heif/subdatasets.heic') assert ds assert len(ds.GetSubDatasets()) == 2 subds1_name = ds.GetSubDatasets()[0][0] subds2_name = ds.GetSubDatasets()[1][0] ds = gdal.Open(subds1_name) assert ds assert ds.RasterXSize == 64 ds = gdal.Open(subds2_name) assert ds assert ds.RasterXSize == 162 with gdaltest.error_handler(): assert gdal.Open('HEIF:0:data/heif/subdatasets.heic') is None assert gdal.Open('HEIF:3:data/heif/subdatasets.heic') is None assert gdal.Open('HEIF:1:non_existing.heic') is None assert gdal.Open('HEIF:') is None assert gdal.Open('HEIF:1') is None assert gdal.Open('HEIF:1:') is None gdalautotest-3.2.2/gdrivers/snodas.py0000775000175000017500000000527014020414367016372 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: snodas.py 094ae37fc77eed5e44675e43128ccb96d6e6b9f4 2020-05-10 15:50:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test SNODAS driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Test a fake SNODAS dataset def test_snodas_1(): tst = gdaltest.GDALTest('SNODAS', 'snodas/fake_snodas.hdr', 1, 0) expected_gt = [-124.733749999995, 0.0083333333333330643, 0.0, 52.874583333331302, 0.0, -0.0083333333333330054] expected_srs = """GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4326"]]""" ret = tst.testOpen(check_gt=expected_gt, check_prj=expected_srs, skip_checksum=True) if ret == 'success': ds = gdal.Open('data/snodas/fake_snodas.hdr') ds.GetFileList() assert ds.GetRasterBand(1).GetNoDataValue() == -9999 assert ds.GetRasterBand(1).GetMinimum() == 0 assert ds.GetRasterBand(1).GetMaximum() == 429 return ret gdalautotest-3.2.2/gdrivers/cals.py0000775000175000017500000001266214020414367016030 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: cals.py f1b948260a71bfacad979faf9ca87bf93e198bc9 2020-05-10 13:09:26 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test CALS driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2015, Even Rouault, # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Source has no color table def test_cals_1(): tst = gdaltest.GDALTest('CALS', 'hfa/small1bit.img', 1, 9907) return tst.testCreateCopy() ############################################################################### # Source has a color table (0,0,0),(255,255,255) def test_cals_2(): # Has no color table tst = gdaltest.GDALTest('CALS', '../../gcore/data/oddsize1bit.tif', 1, 3883) return tst.testCreateCopy() ############################################################################### # Source has a color table (255,255,255),(0,0,0) def test_cals_3(): src_ds = gdal.Open('../gcore/data/oddsize1bit.tif') tmp_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_2_tmp.cal', src_ds) tmp_ds.SetMetadataItem('TIFFTAG_XRESOLUTION', '600') tmp_ds.SetMetadataItem('TIFFTAG_YRESOLUTION', '600') out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_2.cal', tmp_ds) assert gdal.VSIStatL('/vsimem/cals_2.cal.aux.xml') is None assert out_ds.GetRasterBand(1).Checksum() == 3883 assert out_ds.GetMetadataItem('PIXEL_PATH') is None assert out_ds.GetMetadataItem('TIFFTAG_XRESOLUTION') == '600' assert out_ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex tmp_ds = None out_ds = None gdal.Unlink('/vsimem/cals_2_tmp.cal') gdal.Unlink('/vsimem/cals_2_tmp.cal.aux.xml') gdal.Unlink('/vsimem/cals_2.cal') ############################################################################### # Test CreateCopy() error conditions def test_cals_4(): # 0 band src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) gdal.PushErrorHandler() out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds) gdal.PopErrorHandler() assert out_ds is None # 2 bands src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) gdal.PushErrorHandler() out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds, strict=True) gdal.PopErrorHandler() assert out_ds is None # 1 band but not 1-bit src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) gdal.PushErrorHandler() out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds, strict=True) gdal.PopErrorHandler() assert out_ds is None # Dimension > 999999 src_ds = gdal.GetDriverByName('MEM').Create('', 1000000, 1, 1) src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '1', 'IMAGE_STRUCTURE') gdal.PushErrorHandler() out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_4.cal', src_ds, strict=True) gdal.PopErrorHandler() assert out_ds is None # Invalid output filename src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '1', 'IMAGE_STRUCTURE') gdal.PushErrorHandler() out_ds = gdal.GetDriverByName('CALS').CreateCopy('/not_existing_dir/cals_4.cal', src_ds) gdal.PopErrorHandler() assert out_ds is None ############################################################################### # Test PIXEL_PATH & LINE_PROGRESSION metadata item def test_cals_5(): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) src_ds.GetRasterBand(1).SetMetadataItem('NBITS', '1', 'IMAGE_STRUCTURE') src_ds.SetMetadataItem('PIXEL_PATH', '90') src_ds.SetMetadataItem('LINE_PROGRESSION', '270') out_ds = gdal.GetDriverByName('CALS').CreateCopy('/vsimem/cals_5.cal', src_ds) assert gdal.VSIStatL('/vsimem/cals_5.cal.aux.xml') is None assert out_ds.GetMetadataItem('PIXEL_PATH') == '90' assert out_ds.GetMetadataItem('LINE_PROGRESSION') == '270' out_ds = None gdal.Unlink('/vsimem/cals_5.cal') ############################################################################### gdalautotest-3.2.2/gdrivers/isis2.py0000775000175000017500000000626014020414367016134 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: isis2.py 441ccbeb95a8c269ba13d89e5edf933b182b0e22 2020-05-10 17:43:19 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for ISIS2 driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Read a truncated and modified version of arvidson_original.cub from # ftp://ftpflag.wr.usgs.gov/dist/pigpen/venus/venustopo_download/ovda_dtm.zip def test_isis2_1(): tst = gdaltest.GDALTest('ISIS2', 'isis2/arvidson_original_truncated.cub', 1, 382) expected_prj = """PROJCS["SIMPLE_CYLINDRICAL VENUS", GEOGCS["GCS_VENUS", DATUM["D_VENUS", SPHEROID["VENUS",6051000,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Equirectangular"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",0], PARAMETER["standard_parallel_1",-6.5], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["meter",1]]""" expected_gt = (10157400.403618813, 1200.0000476837158, 0.0, -585000.02324581146, 0.0, -1200.0000476837158) return tst.testOpen(check_prj=expected_prj, check_gt=expected_gt) ############################################################################### # Test simple creation on disk. def test_isis2_2(): tst = gdaltest.GDALTest('ISIS2', 'byte.tif', 1, 4672) return tst.testCreate() ############################################################################### # Test a different data type with some options. def test_isis2_3(): tst = gdaltest.GDALTest('ISIS2', 'float32.tif', 1, 4672, options=['LABELING_METHOD=DETACHED', 'IMAGE_EXTENSION=qub']) return tst.testCreateCopy(vsimem=1) gdalautotest-3.2.2/gdrivers/sentinel2.py0000775000175000017500000033333614020414367017015 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: sentinel2.py 95cc0948a1480305ffe6eb18797c78dd6b1c8def 2020-05-10 20:34:33 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Sentinel2 support. # Author: Even Rouault, # Funded by: Centre National d'Etudes Spatiales (CNES) # ############################################################################### # Copyright (c) 2015, Even Rouault, # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import sys from osgeo import gdal import gdaltest import pytest ############################################################################### # Test opening a L1C product def test_sentinel2_l1c_1(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1C', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1C', 'QUANTIFICATION_VALUE': '1000', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution, UTM 32N', 'SUBDATASET_1_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:10m:EPSG_32632', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution, UTM 32N', 'SUBDATASET_2_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:20m:EPSG_32632', 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution, UTM 32N', 'SUBDATASET_3_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:60m:EPSG_32632', 'SUBDATASET_4_DESC': 'RGB preview, UTM 32N', 'SUBDATASET_4_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml:PREVIEW:EPSG_32632'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() # Try opening a zip file as distributed from https://scihub.esa.int/ if not sys.platform.startswith('win'): os.system('sh -c "cd data/sentinel2/fake_l1c && zip -r ../../tmp/S2A_OPER_PRD_MSIL1C.zip S2A_OPER_PRD_MSIL1C.SAFE >/dev/null" && cd ../..') if os.path.exists('tmp/S2A_OPER_PRD_MSIL1C.zip'): ds = gdal.Open('tmp/S2A_OPER_PRD_MSIL1C.zip') assert ds is not None os.unlink('tmp/S2A_OPER_PRD_MSIL1C.zip') # Try opening the 4 subdatasets for i in range(4): gdal.ErrorReset() ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) assert ds is not None and gdal.GetLastErrorMsg() == '', \ got_md['SUBDATASET_%d_NAME' % (i + 1)] # Try various invalid subdataset names for name in ['SENTINEL2_L1C:', 'SENTINEL2_L1C:foo.xml:10m:EPSG_32632', 'SENTINEL2_L1C:%s' % filename_xml, 'SENTINEL2_L1C:%s:' % filename_xml, 'SENTINEL2_L1C:%s:10m' % filename_xml, 'SENTINEL2_L1C:%s:10m:' % filename_xml, 'SENTINEL2_L1C:%s:10m:EPSG_' % filename_xml, 'SENTINEL2_L1C:%s:50m:EPSG_32632' % filename_xml, 'SENTINEL2_L1C:%s:10m:EPSG_32633' % filename_xml]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name ############################################################################### # Test opening a L1C subdataset on the 10m bands def test_sentinel2_l1c_2(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L1C:%s:10m:EPSG_32632' % filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1C', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1C', 'QUANTIFICATION_VALUE': '1000', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 20984 and ds.RasterYSize == 20980 assert ds.GetProjectionRef().find('32632') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 4 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2 1 data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B08.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B4', 'BANDWIDTH': '30', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1500', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '665', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.GetColorInterpretation() == gdal.GCI_RedBand assert band.DataType == gdal.GDT_UInt16 assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' band = ds.GetRasterBand(4) assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B8', 'BANDWIDTH': '115', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1000', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '842', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() ############################################################################### # Test opening a L1C subdataset on the 60m bands and enabling alpha band def test_sentinel2_l1c_3(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' ds = gdal.OpenEx('SENTINEL2_L1C:%s:60m:EPSG_32632' % filename_xml, open_options=['ALPHA=YES']) assert ds is not None assert ds.RasterCount == 4 band = ds.GetRasterBand(4) assert band.GetColorInterpretation() == gdal.GCI_AlphaBand gdal.ErrorReset() cs = band.Checksum() assert cs == 0 and gdal.GetLastErrorMsg() == '' band.ReadRaster() ############################################################################### # Test opening a L1C subdataset on the PREVIEW bands def test_sentinel2_l1c_4(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' ds = gdal.OpenEx('SENTINEL2_L1C:%s:PREVIEW:EPSG_32632' % filename_xml) assert ds is not None assert ds.RasterCount == 3 fl = ds.GetFileList() # main XML + 2 granule XML + 2 jp2 if len(fl) != 1 + 2 + 2: import pprint pprint.pprint(fl) pytest.fail() band = ds.GetRasterBand(1) assert band.GetColorInterpretation() == gdal.GCI_RedBand assert band.DataType == gdal.GDT_Byte ############################################################################### # Test opening invalid XML files def test_sentinel2_l1c_5(): # Invalid XML gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') assert ds is None # File is OK, but granule MTD are missing gdal.FileFromMemBuffer('/vsimem/test.xml', """ B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B8A S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B01 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B06 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B10 S2A_OPER_MSI_L1C_T32TQR_B08 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B07 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B09 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B05 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B12 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B11 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B04 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B03 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B02 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_B8A S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B01 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B06 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B10 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B08 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B07 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B09 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B05 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B12 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B11 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B04 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B03 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B02 S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_B8A """) gdal.ErrorReset() with gdaltest.error_handler(): gdal.Open('/vsimem/test.xml') assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') assert ds is None # No Product_Info gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') assert ds is None # No Product_Organisation gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:10m:EPSG_32632') assert ds is None # No Band_List gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None # No valid bands gdal.FileFromMemBuffer('/vsimem/test.xml', """ Bxx """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None gdal.Unlink('/vsimem/test.xml') ############################################################################### # Windows specific test to test support for long filenames def test_sentinel2_l1c_6(): if sys.platform != 'win32': pytest.skip() filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml' filename_xml = filename_xml.replace('/', '\\') filename_xml = '\\\\?\\' + os.getcwd() + '\\' + filename_xml gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' subds_name = ds.GetMetadataItem('SUBDATASET_1_NAME', 'SUBDATASETS') gdal.ErrorReset() ds = gdal.Open(subds_name) assert ds is not None and gdal.GetLastErrorMsg() == '' ############################################################################### # Test with a real JP2 tile def test_sentinel2_l1c_7(): gdal.FileFromMemBuffer('/vsimem/test.xml', """ B1 S2A_OPER_MSI_L1C_bla_T32TQR_B01 """) gdal.FileFromMemBuffer('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml', """ S2A_OPER_MSI_L1C_bla_N01.03 WGS84 / UTM zone 53S EPSG:32753 1830 1830 499980 7200040 60 -60 """) # Open with missing tile with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:60m:EPSG_32753') ds = None f = open('data/jpeg2000/gtsmall_10_uint16.jp2', 'rb') f2 = gdal.VSIFOpenL('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_bla_B01.jp2', 'wb') data = f.read() gdal.VSIFWriteL(data, 1, len(data), f2) gdal.VSIFCloseL(f2) f.close() ds = gdal.Open('SENTINEL2_L1C:/vsimem/test.xml:60m:EPSG_32753') nbits = ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') assert nbits == '10' gdal.Unlink('/vsimem/test.xml') gdal.Unlink('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_bla_B01.jp2') ############################################################################### # Test opening a L1C tile def test_sentinel2_l1c_tile_1(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'DOWNLINK_PRIORITY': 'NOMINAL', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1C', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1C', 'QUANTIFICATION_VALUE': '1000', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SENSING_TIME': '2015-12-31T23:59:59.999Z', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0', 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution', 'SUBDATASET_1_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:10m', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution', 'SUBDATASET_2_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:20m', 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution', 'SUBDATASET_3_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:60m', 'SUBDATASET_4_DESC': 'RGB preview', 'SUBDATASET_4_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:PREVIEW'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(4): gdal.ErrorReset() ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) assert ds is not None and gdal.GetLastErrorMsg() == '', \ got_md['SUBDATASET_%d_NAME' % (i + 1)] # Try various invalid subdataset names for name in ['SENTINEL2_L1C_TILE:', 'SENTINEL2_L1C_TILE:foo.xml:10m', 'SENTINEL2_L1C_TILE:%s' % filename_xml, 'SENTINEL2_L1C_TILE:%s:' % filename_xml]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name ############################################################################### # Test opening a L1C tile without main MTD file def test_sentinel2_l1c_tile_2(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' gdal.ErrorReset() gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', 'NO') # Simulate absence of main MTD file ds = gdal.Open(filename_xml) gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', None) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'DOWNLINK_PRIORITY': 'NOMINAL', 'SENSING_TIME': '2015-12-31T23:59:59.999Z', 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution', 'SUBDATASET_1_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:10m', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution', 'SUBDATASET_2_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:20m', 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution', 'SUBDATASET_3_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:60m', 'SUBDATASET_4_DESC': 'RGB preview', 'SUBDATASET_4_NAME': 'SENTINEL2_L1C_TILE:data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml:PREVIEW'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() ############################################################################### # Test opening a L1C tile subdataset on the 10m bands def test_sentinel2_l1c_tile_3(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L1C_TILE:%s:10m' % filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'DOWNLINK_PRIORITY': 'NOMINAL', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1C', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1C', 'QUANTIFICATION_VALUE': '1000', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SENSING_TIME': '2015-12-31T23:59:59.999Z', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0', 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 10980 and ds.RasterYSize == 10980 assert ds.GetProjectionRef().find('32632') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 4 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B4', 'BANDWIDTH': '30', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1500', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '665', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.GetColorInterpretation() == gdal.GCI_RedBand assert band.DataType == gdal.GDT_UInt16 assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' band = ds.GetRasterBand(4) assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B8', 'BANDWIDTH': '115', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1000', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '842', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() ############################################################################### # Test opening a L1C tile subdataset on the 10m bands without main MTD file def test_sentinel2_l1c_tile_4(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' gdal.ErrorReset() gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', 'NO') # Simulate absence of main MTD file ds = gdal.OpenEx('SENTINEL2_L1C_TILE:%s:10m' % filename_xml, open_options=['ALPHA=YES']) gdal.SetConfigOption('SENTINEL2_USE_MAIN_MTD', None) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', 'DATASTRIP_ID': 'S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'DOWNLINK_PRIORITY': 'NOMINAL', 'SENSING_TIME': '2015-12-31T23:59:59.999Z', 'TILE_ID': 'S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 10980 and ds.RasterYSize == 10980 assert ds.GetProjectionRef().find('32632') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 5 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B4', 'BANDWIDTH': '30', 'BANDWIDTH_UNIT': 'nm', 'WAVELENGTH': '665', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.GetColorInterpretation() == gdal.GCI_RedBand assert band.DataType == gdal.GDT_UInt16 assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' band = ds.GetRasterBand(5) assert band.GetColorInterpretation() == gdal.GCI_AlphaBand ############################################################################### # Test opening a L1C tile subdataset on the preview bands def test_sentinel2_l1c_tile_5(): filename_xml = 'data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xml' gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L1C_TILE:%s:PREVIEW' % filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' assert ds.RasterXSize == 343 and ds.RasterYSize == 343 assert ds.GetProjectionRef().find('32632') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 320.0, 0.0, 5100060.0, 0.0, -320.0) assert ds.RasterCount == 3 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/QI_DATA/S2A_OPER_PVI_L1C_T32TQR.jp2 3 """ assert placement_vrt in vrt ############################################################################### # Test opening invalid XML files def test_sentinel2_l1c_tile_6(): # Invalid XML gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1C_TILE:/vsimem/test.xml:10m') assert ds is None gdal.FileFromMemBuffer('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml', """ S2A_OPER_MSI_L1C_bla_N01.03 WGS84 / UTM zone 53S EPSG:32753 1830 1830 499980 7200040 60 -60 """) # Just tell it doesn't crash without any tile gdal.Open('/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml') with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1C_TILE:/vsimem/GRANULE/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml:10m') assert ds is None gdal.Unlink('/vsimem/test.xml') gdal.Unlink('/vsimem/S2A_OPER_MSI_L1C_bla_N01.03/S2A_OPER_MTD_L1C_bla.xml') ############################################################################### # Test opening a L1B product def test_sentinel2_l1b_1(): filename_xml = 'data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/S2B_OPER_MTD_SAFL1B.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2B_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2B', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1B', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1B', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 of granule S2B_OPER_MTD_L1B.xml with 10m resolution', 'SUBDATASET_1_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:10m', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 of granule S2B_OPER_MTD_L1B.xml with 20m resolution', 'SUBDATASET_2_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:20m', 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 of granule S2B_OPER_MTD_L1B.xml with 60m resolution', 'SUBDATASET_3_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() # Try opening the 3 subdatasets for i in range(3): gdal.ErrorReset() ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) assert ds is not None and gdal.GetLastErrorMsg() == '', \ got_md['SUBDATASET_%d_NAME' % (i + 1)] # Try various invalid subdataset names for name in ['SENTINEL2_L1B:', 'SENTINEL2_L1B:foo.xml:10m', 'SENTINEL2_L1B:%s' % filename_xml, 'SENTINEL2_L1B:%s:' % filename_xml, 'SENTINEL2_L1B:%s:30m' % filename_xml]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name ############################################################################### # Test opening a L1B granule def test_sentinel2_l1b_2(): filename_xml = 'data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', 'DATASTRIP_ID': 'S2B_OPER_MSI_L1B_DS_MTI__20151231T235959_S20151231T235959_N01.03', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2B_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2B', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'DETECTOR_ID': '02', 'DOWNLINK_PRIORITY': 'NOMINAL', 'FOOTPRINT': 'POLYGON((11 46 1, 11 45 2, 13 45 3, 13 46 4, 11 46 1))', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'GRANULE_ID': 'S2B_OPER_MSI_L1B_GR_MTI__20151231T235959_S20151231T235959_D02_N01.03', 'INCIDENCE_AZIMUTH_ANGLE': '96', 'INCIDENCE_ZENITH_ANGLE': '8', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1B', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1B', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'SENSING_TIME': '2015-12-31T23:59:59.999Z', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SOLAR_AZIMUTH_ANGLE': '158', 'SOLAR_ZENITH_ANGLE': '43', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() subdatasets_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution', 'SUBDATASET_1_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:10m', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution', 'SUBDATASET_2_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:20m', 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution', 'SUBDATASET_3_NAME': 'SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != subdatasets_md: import pprint pprint.pprint(got_md) pytest.fail() cwd = os.getcwd() gdal.ErrorReset() try: os.chdir('data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03') ds = gdal.Open('S2B_OPER_MTD_L1B.xml') finally: os.chdir(cwd) assert ds is not None and gdal.GetLastErrorMsg() == '' got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() ############################################################################### # Test opening a L1B subdataset def test_sentinel2_l1b_3(): gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L1B:data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m') assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUDY_PIXEL_PERCENTAGE': '0', 'DATASTRIP_ID': 'S2B_OPER_MSI_L1B_DS_MTI__20151231T235959_S20151231T235959_N01.03', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2B_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2B', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'DETECTOR_ID': '02', 'DOWNLINK_PRIORITY': 'NOMINAL', 'FOOTPRINT': 'POLYGON((11 46 1, 11 45 2, 13 45 3, 13 46 4, 11 46 1))', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'GRANULE_ID': 'S2B_OPER_MSI_L1B_GR_MTI__20151231T235959_S20151231T235959_D02_N01.03', 'INCIDENCE_AZIMUTH_ANGLE': '96', 'INCIDENCE_ZENITH_ANGLE': '8', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1B', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1B', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'SENSING_TIME': '2015-12-31T23:59:59.999Z', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SOLAR_AZIMUTH_ANGLE': '158', 'SOLAR_ZENITH_ANGLE': '43', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1276 and ds.RasterYSize == 384 assert ds.GetGCPProjection().find('4326') >= 0 gcps = ds.GetGCPs() assert len(gcps) == 5 assert (gcps[0].GCPPixel == 0 and \ gcps[0].GCPLine == 0 and \ gcps[0].GCPX == 11 and \ gcps[0].GCPY == 46 and \ gcps[0].GCPZ == 1) assert (gcps[1].GCPPixel == 0 and \ gcps[1].GCPLine == 384 and \ gcps[1].GCPX == 11 and \ gcps[1].GCPY == 45 and \ gcps[1].GCPZ == 2) assert (gcps[2].GCPPixel == 1276 and \ gcps[2].GCPLine == 384 and \ gcps[2].GCPX == 13 and \ gcps[2].GCPY == 45 and \ gcps[2].GCPZ == 3) assert (gcps[3].GCPPixel == 1276 and \ gcps[3].GCPLine == 0 and \ gcps[3].GCPX == 13 and \ gcps[3].GCPY == 46 and \ gcps[3].GCPZ == 4) assert (gcps[4].GCPPixel == 1276. / 2 and \ gcps[4].GCPLine == 384. / 2 and \ gcps[4].GCPX == 12 and \ gcps[4].GCPY == 45.5 and \ gcps[4].GCPZ == 2.5) assert ds.RasterCount == 3 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B1', 'BANDWIDTH': '20', 'BANDWIDTH_UNIT': 'nm', 'WAVELENGTH': '443', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.DataType == gdal.GDT_UInt16 assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' ############################################################################### # Test opening a L1B granule (with missing tile, without any ../../main_mtd.xml) def test_sentinel2_l1b_4(): gdal.FileFromMemBuffer('/vsimem/foo/S2B_PROD_MTD_foo.xml', """ B1 """) gdal.FileFromMemBuffer('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml', """ S2A_OPER_MSI_L1C_bla_N01.03 1830 1830 """) # Open with missing tile with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m') ds = None # Now open with missing main MTD gdal.Unlink('/vsimem/foo/S2B_PROD_MTD_foo.xml') f = open('data/jpeg2000/gtsmall_10_uint16.jp2', 'rb') f2 = gdal.VSIFOpenL('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2', 'wb') data = f.read() gdal.VSIFWriteL(data, 1, len(data), f2) gdal.VSIFCloseL(f2) f.close() # With brief granule metadata (no Granule_Dimensions) gdal.FileFromMemBuffer('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml', """ S2A_OPER_MSI_L1C_bla_N01.03 """) ds = gdal.Open('SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m') assert ds.RasterXSize == 500 # With standard granule metadata (with Granule_Dimensions) gdal.FileFromMemBuffer('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml', """ S2A_OPER_MSI_L1C_bla_N01.03 1830 1830 """) ds = gdal.Open('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml') expected_md = {'SUBDATASET_1_DESC': 'Bands B1 with 60m resolution', 'SUBDATASET_1_NAME': 'SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() ds = None ds = gdal.OpenEx('SENTINEL2_L1B:/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml:60m', open_options=['ALPHA=YES']) assert ds is not None assert ds.RasterCount == 2 ds = None gdal.Unlink('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/S2B_OPER_MTD_L1B.xml') gdal.Unlink('/vsimem/foo/GRANULE/S2B_OPER_MTD_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2') ############################################################################### # Test opening invalid XML files def test_sentinel2_l1b_5(): # Invalid XML gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None # No Product_Info gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None # No Product_Organisation gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') assert ds is None # No Band_List gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None # No valid bands gdal.FileFromMemBuffer('/vsimem/test.xml', """ Bxx """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None # Invalid XML gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') assert ds is None # No Granule_Dimensions gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') assert ds is None # No ROWS gdal.FileFromMemBuffer('/vsimem/test.xml', """ 2304 2552 """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') assert ds is None # No NCOLS gdal.FileFromMemBuffer('/vsimem/test.xml', """ 2304 2552 """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') assert ds is None # Not the desired resolution gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L1B:/vsimem/test.xml:10m') assert ds is None gdal.Unlink('/vsimem/test.xml') gdal.Unlink('/vsimem/test.xml') ############################################################################### # Test opening a L2A product def test_sentinel2_l2a_1(): filename_xml = 'data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'AOT_RETRIEVAL_ACCURACY': '0', 'BARE_SOILS_PERCENTAGE': '0', 'CLOUD_COVERAGE_ASSESSMENT': '0.0', 'CLOUD_SHADOW_PERCENTAGE': '0', 'DARK_FEATURES_PERCENTAGE': '0', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'HIGH_PROBA_CLOUDS_PERCENTAGE': '0', 'L1C_TOA_QUANTIFICATION_VALUE': '1000', 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_BOA_QUANTIFICATION_VALUE': '1000', 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', 'LOW_PROBA_CLOUDS_PERCENTAGE': '0', 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '0', 'NODATA_PIXEL_PERCENTAGE': '0', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-2Ap', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI2Ap', 'RADIATIVE_TRANSFER_ACCURAY': '0', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SNOW_ICE_PERCENTAGE': '0', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0', 'THIN_CIRRUS_PERCENTAGE': '0', 'VEGETATION_PERCENTAGE': '0', 'WATER_PERCENTAGE': '0', 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = {'SUBDATASET_1_DESC': 'Bands B1, B2, B3, B4, B5, B6, B7, B9, B10, B11, B12, B8A, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 32N', 'SUBDATASET_1_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml:60m:EPSG_32632', 'SUBDATASET_2_DESC': 'RGB preview, UTM 32N', 'SUBDATASET_2_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml:PREVIEW:EPSG_32632'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(2): gdal.ErrorReset() ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) assert ds is not None and gdal.GetLastErrorMsg() == '', \ got_md['SUBDATASET_%d_NAME' % (i + 1)] # Try various invalid subdataset names for name in ['SENTINEL2_L2A:', 'SENTINEL2_L2A:foo.xml:10m:EPSG_32632', 'SENTINEL2_L2A:%s' % filename_xml, 'SENTINEL2_L2A:%s:' % filename_xml, 'SENTINEL2_L2A:%s:10m' % filename_xml, 'SENTINEL2_L2A:%s:10m:' % filename_xml, 'SENTINEL2_L2A:%s:10m:EPSG_' % filename_xml, 'SENTINEL2_L2A:%s:50m:EPSG_32632' % filename_xml, 'SENTINEL2_L2A:%s:10m:EPSG_32633' % filename_xml]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name ############################################################################### # Test opening a L21 subdataset on the 60m bands def test_sentinel2_l2a_2(): filename_xml = 'data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml' gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L2A:%s:60m:EPSG_32632' % filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'AOT_RETRIEVAL_ACCURACY': '0', 'BARE_SOILS_PERCENTAGE': '0', 'CLOUD_COVERAGE_ASSESSMENT': '0.0', 'CLOUD_SHADOW_PERCENTAGE': '0', 'DARK_FEATURES_PERCENTAGE': '0', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'HIGH_PROBA_CLOUDS_PERCENTAGE': '0', 'L1C_TOA_QUANTIFICATION_VALUE': '1000', 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_BOA_QUANTIFICATION_VALUE': '1000', 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', 'LOW_PROBA_CLOUDS_PERCENTAGE': '0', 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '0', 'NODATA_PIXEL_PERCENTAGE': '0', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-2Ap', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI2Ap', 'RADIATIVE_TRANSFER_ACCURAY': '0', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SNOW_ICE_PERCENTAGE': '0', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0', 'THIN_CIRRUS_PERCENTAGE': '0', 'VEGETATION_PERCENTAGE': '0', 'WATER_PERCENTAGE': '0', 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1830 and ds.RasterYSize == 1830 assert ds.GetProjectionRef().find('32632') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 60.0, 0.0, 5100060.0, 0.0, -60.0) assert ds.RasterCount == 17 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B01_60m.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B1', 'BANDWIDTH': '20', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1900', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '443', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.DataType == gdal.GDT_UInt16 band = ds.GetRasterBand(13) assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() expected_md = {'BANDNAME': 'AOT'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() scl_band = 0 for i in range(ds.RasterCount): if ds.GetRasterBand(i + 1).GetMetadataItem('BANDNAME') == 'SCL': scl_band = i + 1 assert scl_band != 0 band = ds.GetRasterBand(scl_band) expected_categories = ['NODATA', 'SATURATED_DEFECTIVE', 'DARK_FEATURE_SHADOW', 'CLOUD_SHADOW', 'VEGETATION', 'BARE_SOIL_DESERT', 'WATER', 'CLOUD_LOW_PROBA', 'CLOUD_MEDIUM_PROBA', 'CLOUD_HIGH_PROBA', 'THIN_CIRRUS', 'SNOW_ICE'] got_categories = band.GetCategoryNames() if got_categories != expected_categories: import pprint pprint.pprint(got_categories) pytest.fail() ############################################################################### # Test opening invalid XML files def test_sentinel2_l2a_3(): # Invalid XML gdal.FileFromMemBuffer('/vsimem/test.xml', """ """) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/test.xml') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L2A:/vsimem/test.xml:10m:EPSG_32632') assert ds is None # File is OK, but granule MTD are missing gdal.FileFromMemBuffer('/vsimem/test.xml', """ B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B8A S2A_OPER_MSI_L2A_TL_MTI__20151231T235959_A000123_T32TQR_B01_60m """) gdal.ErrorReset() with gdaltest.error_handler(): gdal.Open('/vsimem/test.xml') assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('SENTINEL2_L2A:/vsimem/test.xml:10m:EPSG_32632') assert ds is None gdal.Unlink('/vsimem/test.xml') ############################################################################### # Test opening a L2A MSIL2A product def test_sentinel2_l2a_4(): filename_xml = 'data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = { 'AOT_QUANTIFICATION_VALUE': '1000.0', 'AOT_QUANTIFICATION_VALUE_UNIT': 'none', 'AOT_RETRIEVAL_ACCURACY': '0.0', 'BOA_QUANTIFICATION_VALUE': '10000', 'BOA_QUANTIFICATION_VALUE_UNIT': 'none', 'CLOUD_COVERAGE_ASSESSMENT': '54.4', 'CLOUD_SHADOW_PERCENTAGE': '1.5', 'DARK_FEATURES_PERCENTAGE': '1.5', 'DATATAKE_1_DATATAKE_SENSING_START': '2018-08-18T09:40:31.024Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20180818T094031_016478_N02.08', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0.0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FOOTPRINT': 'POLYGON((22.6 57.7, 24.5 57.6, 24.4 56.7, 22.6 56.7, 22.6 57.7))', 'FORMAT_CORRECTNESS': 'PASSED', 'GENERAL_QUALITY': 'PASSED', 'GENERATION_TIME': '2018-08-18T12:03:45.000000Z', 'GEOMETRIC_QUALITY': 'PASSED', 'HIGH_PROBA_CLOUDS_PERCENTAGE': '15.3', 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '24.1', 'NODATA_PIXEL_PERCENTAGE': '0.0', 'NOT_VEGETATED_PERCENTAGE': '3.5', 'PREVIEW_GEO_INFO': 'Not applicable', 'PREVIEW_IMAGE_URL': 'Not applicable', 'PROCESSING_BASELINE': '02.08', 'PROCESSING_LEVEL': 'Level-2A', 'PRODUCT_START_TIME': '2018-08-18T09:40:31.024Z', 'PRODUCT_STOP_TIME': '2018-08-18T09:40:31.024Z', 'PRODUCT_TYPE': 'S2MSI2A', 'PRODUCT_URI': 'S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE', 'RADIATIVE_TRANSFER_ACCURACY': '0.0', 'RADIOMETRIC_QUALITY': 'PASSED', 'REFLECTANCE_CONVERSION_U': '0.97', 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', 'SENSOR_QUALITY': 'PASSED', 'SNOW_ICE_PERCENTAGE': '0.4', 'SPECIAL_VALUE_NODATA': '0', 'SPECIAL_VALUE_SATURATED': '6', 'THIN_CIRRUS_PERCENTAGE': '14.9', 'UNCLASSIFIED_PERCENTAGE': '5.7', 'VEGETATION_PERCENTAGE': '14.0', 'WATER_PERCENTAGE': '18.7', 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0', 'WVP_QUANTIFICATION_VALUE': '1000.0', 'WVP_QUANTIFICATION_VALUE_UNIT': 'cm'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = { 'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution, UTM 34N', 'SUBDATASET_1_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:10m:EPSG_32634', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12, AOT, CLD, SCL, SNW, WVP with 20m resolution, UTM 34N', 'SUBDATASET_2_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:20m:EPSG_32634', 'SUBDATASET_3_DESC': 'Bands B1, B9, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 34N', 'SUBDATASET_3_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:60m:EPSG_32634', 'SUBDATASET_4_DESC': 'True color image, UTM 34N', 'SUBDATASET_4_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml:TCI:EPSG_32634'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(2): gdal.ErrorReset() ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) assert ds is not None and gdal.GetLastErrorMsg() == '', \ got_md['SUBDATASET_%d_NAME' % (i + 1)] # Try various invalid subdataset names for name in ['SENTINEL2_L2A:', 'SENTINEL2_L2A:foo.xml:10m:EPSG_32632', 'SENTINEL2_L2A:%s' % filename_xml, 'SENTINEL2_L2A:%s:' % filename_xml, 'SENTINEL2_L2A:%s:10m' % filename_xml, 'SENTINEL2_L2A:%s:10m:' % filename_xml, 'SENTINEL2_L2A:%s:10m:EPSG_' % filename_xml, 'SENTINEL2_L2A:%s:50m:EPSG_32632' % filename_xml, 'SENTINEL2_L2A:%s:10m:EPSG_32633' % filename_xml]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name ############################################################################### # Test opening a L2A MSIL2A subdataset on the 60m bands def test_sentinel2_l2a_5(): filename_xml = 'data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xml' gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L2A:%s:60m:EPSG_32634' % filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = { 'AOT_QUANTIFICATION_VALUE': '1000.0', 'AOT_QUANTIFICATION_VALUE_UNIT': 'none', 'AOT_RETRIEVAL_ACCURACY': '0.0', 'BOA_QUANTIFICATION_VALUE': '10000', 'BOA_QUANTIFICATION_VALUE_UNIT': 'none', 'CLOUD_COVERAGE_ASSESSMENT': '54.4', 'CLOUD_SHADOW_PERCENTAGE': '1.5', 'DARK_FEATURES_PERCENTAGE': '1.5', 'DATATAKE_1_DATATAKE_SENSING_START': '2018-08-18T09:40:31.024Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20180818T094031_016478_N02.08', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0.0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FORMAT_CORRECTNESS': 'PASSED', 'GENERAL_QUALITY': 'PASSED', 'GENERATION_TIME': '2018-08-18T12:03:45.000000Z', 'GEOMETRIC_QUALITY': 'PASSED', 'HIGH_PROBA_CLOUDS_PERCENTAGE': '15.3', 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '24.1', 'NODATA_PIXEL_PERCENTAGE': '0.0', 'NOT_VEGETATED_PERCENTAGE': '3.5', 'PREVIEW_GEO_INFO': 'Not applicable', 'PREVIEW_IMAGE_URL': 'Not applicable', 'PROCESSING_BASELINE': '02.08', 'PROCESSING_LEVEL': 'Level-2A', 'PRODUCT_START_TIME': '2018-08-18T09:40:31.024Z', 'PRODUCT_STOP_TIME': '2018-08-18T09:40:31.024Z', 'PRODUCT_TYPE': 'S2MSI2A', 'PRODUCT_URI': 'S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE', 'RADIATIVE_TRANSFER_ACCURACY': '0.0', 'RADIOMETRIC_QUALITY': 'PASSED', 'REFLECTANCE_CONVERSION_U': '0.97', 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', 'SENSOR_QUALITY': 'PASSED', 'SNOW_ICE_PERCENTAGE': '0.4', 'SPECIAL_VALUE_NODATA': '0', 'SPECIAL_VALUE_SATURATED': '6', 'THIN_CIRRUS_PERCENTAGE': '14.9', 'UNCLASSIFIED_PERCENTAGE': '5.7', 'VEGETATION_PERCENTAGE': '14.0', 'WATER_PERCENTAGE': '18.7', 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0', 'WVP_QUANTIFICATION_VALUE': '1000.0', 'WVP_QUANTIFICATION_VALUE_UNIT': 'cm'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1830 and ds.RasterYSize == 1830 assert ds.GetProjectionRef().find('32634') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (600000.0, 60.0, 0.0, 6400020.0, 0.0, -60.0) assert ds.RasterCount == 7 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B01_60m.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B1', 'BANDWIDTH': '20', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1884.69', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '443', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.DataType == gdal.GDT_UInt16 ############################################################################### # Test opening a L2A MSIL2Ap product def test_sentinel2_l2a_6(): filename_xml = 'data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = { 'AOT_RETRIEVAL_ACCURACY': '0.0', 'BARE_SOILS_PERCENTAGE': '0.4', 'CLOUD_COVERAGE_ASSESSMENT': '86.3', 'CLOUD_COVERAGE_PERCENTAGE': '84.4', 'CLOUD_SHADOW_PERCENTAGE': '4.1', 'DARK_FEATURES_PERCENTAGE': '1.0', 'DATATAKE_1_DATATAKE_SENSING_START': '2017-08-23T09:40:31.026Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20170823T094031_011330_N02.05', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FOOTPRINT': 'POLYGON((22.6 57.7, 24.5 57.6, 24.4 56.7, 22.6 56.7, 22.6 57.7))', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2017-08-25T08:50:10Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'HIGH_PROBA_CLOUDS_PERCENTAGE': '36.1', 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '28.9', 'L1C_TOA_QUANTIFICATION_VALUE': '10000', 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_BOA_QUANTIFICATION_VALUE': '10000', 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', 'LOW_PROBA_CLOUDS_PERCENTAGE': '1.6', 'NODATA_PIXEL_PERCENTAGE': '0.0', 'PREVIEW_GEO_INFO': 'Not applicable', 'PREVIEW_IMAGE_URL': 'Not applicable', 'PROCESSING_BASELINE': '02.05', 'PROCESSING_LEVEL': 'Level-2Ap', 'PRODUCT_START_TIME': '2017-08-23T09:40:31.026Z', 'PRODUCT_STOP_TIME': '2017-08-23T09:40:31.026Z', 'PRODUCT_TYPE': 'S2MSI2Ap', 'PRODUCT_URI_1C': 'S2A_MSIL1C_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', 'PRODUCT_URI_2A': 'S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', 'RADIATIVE_TRANSFER_ACCURAY': '0.0', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SNOW_ICE_PERCENTAGE': '0.2', 'SPECIAL_VALUE_NODATA': '0', 'SPECIAL_VALUE_SATURATED': '6', 'THIN_CIRRUS_PERCENTAGE': '19.3', 'VEGETATION_PERCENTAGE': '5.0', 'WATER_PERCENTAGE': '2.9', 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = { 'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution, UTM 34N', 'SUBDATASET_1_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:10m:EPSG_32634', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12, AOT, CLD, SCL, SNW, WVP with 20m resolution, UTM 34N', 'SUBDATASET_2_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:20m:EPSG_32634', 'SUBDATASET_3_DESC': 'Bands B1, B9, AOT, CLD, SCL, SNW, WVP with 60m resolution, UTM 34N', 'SUBDATASET_3_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:60m:EPSG_32634', 'SUBDATASET_4_DESC': 'True color image, UTM 34N', 'SUBDATASET_4_NAME': 'SENTINEL2_L2A:data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml:TCI:EPSG_32634'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(2): gdal.ErrorReset() ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) assert ds is not None and gdal.GetLastErrorMsg() == '', \ got_md['SUBDATASET_%d_NAME' % (i + 1)] # Try various invalid subdataset names for name in ['SENTINEL2_L2A:', 'SENTINEL2_L2A:foo.xml:10m:EPSG_32632', 'SENTINEL2_L2A:%s' % filename_xml, 'SENTINEL2_L2A:%s:' % filename_xml, 'SENTINEL2_L2A:%s:10m' % filename_xml, 'SENTINEL2_L2A:%s:10m:' % filename_xml, 'SENTINEL2_L2A:%s:10m:EPSG_' % filename_xml, 'SENTINEL2_L2A:%s:50m:EPSG_32632' % filename_xml, 'SENTINEL2_L2A:%s:10m:EPSG_32633' % filename_xml]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name ############################################################################### # Test opening a L2A MSIL2Ap subdataset on the 60m bands def test_sentinel2_l2a_7(): filename_xml = 'data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xml' gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L2A:%s:60m:EPSG_32634' % filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = { 'AOT_RETRIEVAL_ACCURACY': '0.0', 'BARE_SOILS_PERCENTAGE': '0.4', 'CLOUD_COVERAGE_ASSESSMENT': '86.3', 'CLOUD_COVERAGE_PERCENTAGE': '84.4', 'CLOUD_SHADOW_PERCENTAGE': '4.1', 'DARK_FEATURES_PERCENTAGE': '1.0', 'DATATAKE_1_DATATAKE_SENSING_START': '2017-08-23T09:40:31.026Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20170823T094031_011330_N02.05', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '36', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2017-08-25T08:50:10Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'HIGH_PROBA_CLOUDS_PERCENTAGE': '36.1', 'MEDIUM_PROBA_CLOUDS_PERCENTAGE': '28.9', 'L1C_TOA_QUANTIFICATION_VALUE': '10000', 'L1C_TOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_AOT_QUANTIFICATION_VALUE': '1000.0', 'L2A_AOT_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_BOA_QUANTIFICATION_VALUE': '10000', 'L2A_BOA_QUANTIFICATION_VALUE_UNIT': 'none', 'L2A_WVP_QUANTIFICATION_VALUE': '1000.0', 'L2A_WVP_QUANTIFICATION_VALUE_UNIT': 'cm', 'LOW_PROBA_CLOUDS_PERCENTAGE': '1.6', 'NODATA_PIXEL_PERCENTAGE': '0.0', 'PREVIEW_GEO_INFO': 'Not applicable', 'PREVIEW_IMAGE_URL': 'Not applicable', 'PROCESSING_BASELINE': '02.05', 'PROCESSING_LEVEL': 'Level-2Ap', 'PRODUCT_START_TIME': '2017-08-23T09:40:31.026Z', 'PRODUCT_STOP_TIME': '2017-08-23T09:40:31.026Z', 'PRODUCT_TYPE': 'S2MSI2Ap', 'PRODUCT_URI_1C': 'S2A_MSIL1C_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', 'PRODUCT_URI_2A': 'S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE', 'RADIATIVE_TRANSFER_ACCURAY': '0.0', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SATURATED_DEFECTIVE_PIXEL_PERCENTAGE': '0.0', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SNOW_ICE_PERCENTAGE': '0.2', 'SPECIAL_VALUE_NODATA': '0', 'SPECIAL_VALUE_SATURATED': '6', 'THIN_CIRRUS_PERCENTAGE': '19.3', 'VEGETATION_PERCENTAGE': '5.0', 'WATER_PERCENTAGE': '2.9', 'WATER_VAPOUR_RETRIEVAL_ACCURACY': '0.0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 1830 and ds.RasterYSize == 1830 assert ds.GetProjectionRef().find('32634') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (600000.0, 60.0, 0.0, 6400020.0, 0.0, -60.0) assert ds.RasterCount == 7 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B01_60m.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B1', 'BANDWIDTH': '20', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1913.57', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '443', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.DataType == gdal.GDT_UInt16 ############################################################################### # Test opening a L1C Safe Compact product def test_sentinel2_l1c_safe_compact_1(): filename_xml = 'data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml' gdal.ErrorReset() ds = gdal.Open(filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FOOTPRINT': 'POLYGON((11 46, 11 45, 13 45, 13 46, 11 46))', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1C', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1C', 'QUANTIFICATION_VALUE': '1000', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() expected_md = {'SUBDATASET_1_DESC': 'Bands B2, B3, B4, B8 with 10m resolution, UTM 32N', 'SUBDATASET_1_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632', 'SUBDATASET_2_DESC': 'Bands B5, B6, B7, B8A, B11, B12 with 20m resolution, UTM 32N', 'SUBDATASET_2_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:20m:EPSG_32632', 'SUBDATASET_3_DESC': 'Bands B1, B9, B10 with 60m resolution, UTM 32N', 'SUBDATASET_3_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:60m:EPSG_32632', 'SUBDATASET_4_DESC': 'True color image, UTM 32N', 'SUBDATASET_4_NAME': 'SENTINEL2_L1C:data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml:TCI:EPSG_32632'} got_md = ds.GetMetadata('SUBDATASETS') if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() # Try opening the 4 subdatasets for i in range(4): gdal.ErrorReset() ds = gdal.Open(got_md['SUBDATASET_%d_NAME' % (i + 1)]) assert ds is not None and gdal.GetLastErrorMsg() == '', \ got_md['SUBDATASET_%d_NAME' % (i + 1)] # Try various invalid subdataset names for name in ['SENTINEL2_L1C:', 'SENTINEL2_L1C:foo.xml:10m:EPSG_32632', 'SENTINEL2_L1C:%s' % filename_xml, 'SENTINEL2_L1C:%s:' % filename_xml, 'SENTINEL2_L1C:%s:10m' % filename_xml, 'SENTINEL2_L1C:%s:10m:' % filename_xml, 'SENTINEL2_L1C:%s:10m:EPSG_' % filename_xml, 'SENTINEL2_L1C:%s:50m:EPSG_32632' % filename_xml, 'SENTINEL2_L1C:%s:10m:EPSG_32633' % filename_xml]: with gdaltest.error_handler(): ds = gdal.Open(name) assert ds is None, name # Try opening a zip file as distributed from https://scihub.esa.int/ if not sys.platform.startswith('win'): os.system('sh -c "cd data/sentinel2/fake_l1c_safecompact && zip -r ../../tmp/S2A_MSIL1C_test.zip S2A_OPER_PRD_MSIL1C.SAFE >/dev/null" && cd ../..') if os.path.exists('tmp/S2A_MSIL1C_test.zip'): ds = gdal.Open('tmp/S2A_MSIL1C_test.zip') assert ds is not None os.unlink('tmp/S2A_MSIL1C_test.zip') ############################################################################### # Test opening a L1C Safe Compact subdataset on the 10m bands def test_sentinel2_l1c_safe_compact_2(): filename_xml = 'data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml' gdal.ErrorReset() ds = gdal.Open('SENTINEL2_L1C:%s:10m:EPSG_32632' % filename_xml) assert ds is not None and gdal.GetLastErrorMsg() == '' expected_md = {'CLOUD_COVERAGE_ASSESSMENT': '0.0', 'DATATAKE_1_DATATAKE_SENSING_START': '2015-12-31T23:59:59.999Z', 'DATATAKE_1_DATATAKE_TYPE': 'INS-NOBS', 'DATATAKE_1_ID': 'GS2A_20151231T235959_000123_N01.03', 'DATATAKE_1_SENSING_ORBIT_DIRECTION': 'DESCENDING', 'DATATAKE_1_SENSING_ORBIT_NUMBER': '22', 'DATATAKE_1_SPACECRAFT_NAME': 'Sentinel-2A', 'DEGRADED_ANC_DATA_PERCENTAGE': '0', 'DEGRADED_MSI_DATA_PERCENTAGE': '0', 'FORMAT_CORRECTNESS_FLAG': 'PASSED', 'GENERAL_QUALITY_FLAG': 'PASSED', 'GENERATION_TIME': '2015-12-31T23:59:59.999Z', 'GEOMETRIC_QUALITY_FLAG': 'PASSED', 'PREVIEW_GEO_INFO': 'BrowseImageFootprint', 'PREVIEW_IMAGE_URL': 'http://example.com', 'PROCESSING_BASELINE': '01.03', 'PROCESSING_LEVEL': 'Level-1C', 'PRODUCT_START_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_STOP_TIME': '2015-12-31T23:59:59.999Z', 'PRODUCT_TYPE': 'S2MSI1C', 'QUANTIFICATION_VALUE': '1000', 'RADIOMETRIC_QUALITY_FLAG': 'PASSED', 'REFERENCE_BAND': 'B1', 'REFLECTANCE_CONVERSION_U': '0.97', 'SENSOR_QUALITY_FLAG': 'PASSED', 'SPECIAL_VALUE_NODATA': '1', 'SPECIAL_VALUE_SATURATED': '0'} got_md = ds.GetMetadata() if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert ds.RasterXSize == 10980 and ds.RasterYSize == 10980 assert ds.GetProjectionRef().find('32632') >= 0 got_gt = ds.GetGeoTransform() assert got_gt == (699960.0, 10.0, 0.0, 5100060.0, 0.0, -10.0) assert ds.RasterCount == 4 vrt = ds.GetMetadata('xml:VRT')[0] placement_vrt = """ data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B04.jp2 1 """ assert placement_vrt in vrt assert ds.GetMetadata('xml:SENTINEL2') is not None band = ds.GetRasterBand(1) got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B4', 'BANDWIDTH': '30', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1500', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '665', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() assert band.GetColorInterpretation() == gdal.GCI_RedBand assert band.DataType == gdal.GDT_UInt16 assert band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '12' band = ds.GetRasterBand(4) assert band.GetColorInterpretation() == gdal.GCI_Undefined got_md = band.GetMetadata() expected_md = {'BANDNAME': 'B8', 'BANDWIDTH': '115', 'BANDWIDTH_UNIT': 'nm', 'SOLAR_IRRADIANCE': '1000', 'SOLAR_IRRADIANCE_UNIT': 'W/m2/um', 'WAVELENGTH': '842', 'WAVELENGTH_UNIT': 'nm'} if got_md != expected_md: import pprint pprint.pprint(got_md) pytest.fail() ############################################################################### # Test opening a L1C subdataset on the TCI bands def test_sentinel2_l1c_safe_compact_3(): filename_xml = 'data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml' ds = gdal.OpenEx('SENTINEL2_L1C:%s:TCI:EPSG_32632' % filename_xml) assert ds is not None assert ds.RasterCount == 3 fl = ds.GetFileList() # main XML + 1 granule XML + 1 jp2 if len(fl) != 1 + 1 + 1: import pprint pprint.pprint(fl) pytest.fail() band = ds.GetRasterBand(1) assert band.GetColorInterpretation() == gdal.GCI_RedBand assert band.DataType == gdal.GDT_Byte gdalautotest-3.2.2/gdrivers/hdf5multidim.py0000775000175000017500000005222514020414367017500 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: hdf5multidim.py 2f6e02577cb509ce740f5f2f30cb4117ac003dac 2020-07-13 13:31:39 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test multidimensional support in HDF5 driver # Author: Even Rouault # ############################################################################### # Copyright (c) 2019, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest import pytest import struct from osgeo import gdal pytestmark = pytest.mark.require_driver('HDF5') def test_hdf5_multidim_basic(): ds = gdal.OpenEx('data/hdf5/u8be.h5', gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg assert not rg.GetGroupNames() assert not rg.OpenGroup('non_existing') assert rg.GetMDArrayNames() == [ 'TestArray' ] assert not rg.OpenMDArray('non_existing') ar = rg.OpenMDArray('TestArray') assert ar assert not ar.GetAttribute('non_existing') dims = ar.GetDimensions() assert len(dims) == 2 assert dims[0].GetSize() == 6 assert dims[1].GetSize() == 5 assert ar.GetDataType().GetNumericDataType() == gdal.GDT_Byte got_data = ar.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert len(got_data) == 30 * 2 assert struct.unpack('H' * 30, got_data) == (0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9) got_data = ar.Read( array_start_idx = [2, 1], count = [3, 2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert len(got_data) == 6 * 2 assert struct.unpack('H' * 6, got_data) == (3, 4, 4, 5, 5, 6) got_data = ar.Read( array_start_idx = [2, 1], count = [3, 2], array_step = [-1, -1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert len(got_data) == 6 * 2 assert struct.unpack('H' * 6, got_data) == (3, 2, 2, 1, 1, 0) with gdaltest.config_option('GDAL_HDF5_TEMP_ARRAY_ALLOC_SIZE', '0'): got_data = ar.Read( array_start_idx = [2, 1], count = [3, 2], array_step = [-1, -1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert len(got_data) == 6 * 2 assert struct.unpack('H' * 6, got_data) == (3, 2, 2, 1, 1, 0) def test_hdf5_multidim_var_alldatatypes(): ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) assert ds rg = ds.GetRootGroup() assert rg expected_vars = [ #('char_var', gdal.GDT_Byte, (ord('x'),ord('y'))), ('ubyte_var', gdal.GDT_Byte, (255, 254)), ('byte_var', gdal.GDT_Int16, (-128,-127)), ('byte_unsigned_false_var', gdal.GDT_Int16, (-128,-127)), #('byte_unsigned_true_var', gdal.GDT_Byte, (128, 129)), ('ushort_var', gdal.GDT_UInt16, (65534, 65533)), ('short_var', gdal.GDT_Int16, (-32768, -32767)), ('uint_var', gdal.GDT_UInt32, (4294967294, 4294967293)), ('int_var', gdal.GDT_Int32, (-2147483648, -2147483647)), ('uint64_var', gdal.GDT_Float64, (1.8446744073709552e+19, 1.8446744073709552e+19)), ('int64_var', gdal.GDT_Float64, (-9.223372036854776e+18, -9.223372036854776e+18)), ('float_var', gdal.GDT_Float32, (1.25, 2.25)), ('double_var', gdal.GDT_Float64, (1.25125, 2.25125)), ('complex_int16_var', gdal.GDT_CInt16, (-32768, -32767, -32766, -32765)), ('complex_int32_var', gdal.GDT_CInt32, (-2147483648, -2147483647, -2147483646, -2147483645)), ('complex64_var', gdal.GDT_CFloat32, (1.25, 2.5, 2.25, 3.5)), ('complex128_var', gdal.GDT_CFloat64, (1.25125, 2.25125, 3.25125, 4.25125)), ] for var_name, dt, val in expected_vars: var = rg.OpenMDArray(var_name) assert var assert var.GetDataType().GetClass() == gdal.GEDTC_NUMERIC, var_name assert var.GetDataType().GetNumericDataType() == dt, var_name if dt == gdal.GDT_Byte: assert struct.unpack('B' * len(val), var.Read()) == val if dt == gdal.GDT_UInt16: assert struct.unpack('H' * len(val), var.Read()) == val if dt == gdal.GDT_Int16: assert struct.unpack('h' * len(val), var.Read()) == val if dt == gdal.GDT_UInt32: assert struct.unpack('I' * len(val), var.Read()) == val if dt == gdal.GDT_Int32: assert struct.unpack('i' * len(val), var.Read()) == val if dt == gdal.GDT_Float32: assert struct.unpack('f' * len(val), var.Read()) == val if dt == gdal.GDT_Float64: assert struct.unpack('d' * len(val), var.Read()) == val if dt == gdal.GDT_CInt16: assert struct.unpack('h' * len(val), var.Read()) == val if dt == gdal.GDT_CInt32: assert struct.unpack('i' * len(val), var.Read()) == val if dt == gdal.GDT_CFloat32: assert struct.unpack('f' * len(val), var.Read()) == val if dt == gdal.GDT_CFloat64: assert struct.unpack('d' * len(val), var.Read()) == val var = rg.OpenMDArray('custom_type_2_elts_var') dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_COMPOUND assert dt.GetSize() == 8 assert dt.GetName() == 'custom_type_2_elts' comps = dt.GetComponents() assert len(comps) == 2 assert comps[0].GetName() == 'x' assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int32 assert comps[1].GetName() == 'y' assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int16 data = var.Read() assert len(data) == 2 * 8 assert struct.unpack('ihihh', data) == (1, 2, 3, 4, 0) var = rg.OpenMDArray('custom_type_3_elts_var') dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_COMPOUND assert dt.GetSize() == 12 comps = dt.GetComponents() assert len(comps) == 3 assert comps[0].GetName() == 'x' assert comps[0].GetOffset() == 0 assert comps[0].GetType().GetNumericDataType() == gdal.GDT_Int32 assert comps[1].GetName() == 'y' assert comps[1].GetOffset() == 4 assert comps[1].GetType().GetNumericDataType() == gdal.GDT_Int16 assert comps[2].GetName() == 'z' assert comps[2].GetOffset() == 8 assert comps[2].GetType().GetNumericDataType() == gdal.GDT_Float32 data = var.Read() assert len(data) == 2 * 12 assert struct.unpack('ihf' * 2, data) == (1, 2, 3.5, 4, 5, 6.5) var = rg.OpenMDArray('string_var') dt = var.GetDataType() assert dt.GetClass() == gdal.GEDTC_STRING assert var.Read() == ['abcd', 'ef'] def test_hdf5_multidim_read_array(): ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() # 0D var = rg.OpenMDArray('ubyte_no_dim_var') assert var assert struct.unpack('B', var.Read()) == (2,) assert struct.unpack('H', var.Read(buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16))) == (2,) # 1D var = rg.OpenMDArray('ubyte_x2_var') data = var.Read(array_start_idx = [1], count = [2], array_step = [2]) got_data_ref = (2, 4) assert struct.unpack('B' * len(data), data) == got_data_ref data = var.Read(array_start_idx = [1], count = [2], array_step = [2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref data = var.Read(array_start_idx = [2], count = [2], array_step = [-2]) got_data_ref = (3, 1) assert struct.unpack('B' * len(data), data) == got_data_ref # 2D var = rg.OpenMDArray('ubyte_y2_x2_var') data = var.Read(count = [2, 3], array_step = [2, 1]) got_data_ref = (1, 2, 3, 9, 10, 11) assert struct.unpack('B' * len(data), data) == got_data_ref data = var.Read(count = [2, 3], array_step = [2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref data = var.Read(array_start_idx = [1, 2], count = [2, 2]) got_data_ref = (7, 8, 11, 12) assert struct.unpack('B' * len(data), data) == got_data_ref data = var.Read(array_start_idx = [1, 2], count = [2, 2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref # 3D var = rg.OpenMDArray('ubyte_z2_y2_x2_var') data = var.Read(count = [3, 2, 3], array_step = [1, 2, 1]) got_data_ref = (1, 2, 3, 9, 10, 11, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1) assert struct.unpack('B' * len(data), data) == got_data_ref data = var.Read(count = [3, 2, 3], array_step = [1, 2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref data = var.Read(array_start_idx = [1, 1, 1], count = [3, 2, 2]) got_data_ref = (7, 8, 11, 12, 8, 9, 12, 1, 9, 10, 1, 2) assert struct.unpack('B' * len(data), data) == got_data_ref data = var.Read(array_start_idx = [1, 1, 1], count = [3, 2, 2], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref # Test reading from slice (most optimized path) data = var.Read(array_start_idx = [3, 0, 0], count = [1, 2, 3]) data_from_slice = var[3].Read(count = [2, 3]) assert data_from_slice == data # Test reading from slice (slow path) data = var.Read(array_start_idx = [3, 0 + (2-1) * 2, 0 + (3-1) * 1], count = [1, 2, 3], array_step = [1, -2, -1]) data_from_slice = var[3].Read(array_start_idx = [0 + (2-1) * 2, 0 + (3-1) * 1], count = [2, 3], array_step = [-2, -1]) assert data_from_slice == data # 4D var = rg.OpenMDArray('ubyte_t2_z2_y2_x2_var') data = var.Read(count = [2, 3, 2, 3], array_step = [1, 1, 2, 1]) got_data_ref = (1, 2, 3, 9, 10, 11, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1, 2, 3, 4, 10, 11, 12, 3, 4, 5, 11, 12, 1, 4, 5, 6, 12, 1, 2) assert struct.unpack('B' * len(data), data) == got_data_ref data = var.Read(count = [2, 3, 2, 3], array_step = [1, 1, 2, 1], buffer_datatype = gdal.ExtendedDataType.Create(gdal.GDT_UInt16)) assert struct.unpack('H' * (len(data) // 2), data) == got_data_ref def test_hdf5_multidim_attr_alldatatypes(): ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() attrs = rg.GetAttributes() assert len(attrs) == 1 assert attrs[0].GetName() == 'global_attr' attrs = rg.OpenGroup('group').GetAttributes() assert len(attrs) == 1 assert attrs[0].GetName() == 'group_global_attr' var = rg.OpenMDArray('ubyte_var') assert var attrs = var.GetAttributes() assert len(attrs) == 30 map_attrs = {} for attr in attrs: map_attrs[attr.GetName()] = attr attr = map_attrs['attr_byte'] assert attr.GetDimensionCount() == 0 assert len(attr.GetDimensionsSize()) == 0 assert attr.GetDataType().GetNumericDataType() == gdal.GDT_Int16 assert attr.Read() == -128 assert map_attrs['attr_ubyte'].Read() == 255 assert map_attrs['attr_char'].GetDataType().GetClass() == gdal.GEDTC_STRING assert map_attrs['attr_char'].GetDimensionCount() == 0 assert map_attrs['attr_char'].Read() == 'x' assert map_attrs['attr_char'].ReadAsStringArray() == ['x'] with gdaltest.error_handler(): assert not map_attrs['attr_char'].ReadAsRaw() assert map_attrs['attr_string_as_repeated_char'].GetDataType().GetClass() == gdal.GEDTC_STRING assert map_attrs['attr_string_as_repeated_char'].GetDimensionCount() == 0 assert map_attrs['attr_string_as_repeated_char'].Read() == 'xy' assert map_attrs['attr_string_as_repeated_char'].ReadAsStringArray() == ['xy'] assert map_attrs['attr_empty_char'].GetDataType().GetClass() == gdal.GEDTC_STRING assert map_attrs['attr_empty_char'].GetDimensionCount() == 0 assert map_attrs['attr_empty_char'].Read() == '' assert map_attrs['attr_two_strings'].GetDataType().GetClass() == gdal.GEDTC_STRING assert map_attrs['attr_two_strings'].GetDimensionCount() == 1 assert map_attrs['attr_two_strings'].GetDimensionsSize()[0] == 2 assert map_attrs['attr_two_strings'].Read() == ['ab', 'cd'] assert map_attrs['attr_two_strings'].ReadAsString() == 'ab' assert map_attrs['attr_int'].Read() == -2147483647 assert map_attrs['attr_float'].Read() == 1.25 assert map_attrs['attr_double'].Read() == 1.25125 assert map_attrs['attr_double'].ReadAsDoubleArray() == (1.25125,) assert map_attrs['attr_int64'].Read() == -9.223372036854776e+18 assert map_attrs['attr_uint64'].Read() == 1.8446744073709552e+19 assert map_attrs['attr_complex_int16'].GetDataType().GetNumericDataType() == gdal.GDT_CInt16 assert struct.unpack('H'* 2, map_attrs['attr_complex_int16'].ReadAsRaw()) == (1, 2) assert map_attrs['attr_complex_int16'].Read() == 1.0 assert map_attrs['attr_complex_int16'].ReadAsString() == '1+2j' assert map_attrs['attr_two_bytes'].Read() == (-128, -127) assert map_attrs['attr_two_ints'].Read() == (-2147483648, -2147483647) assert map_attrs['attr_two_doubles'].GetDataType().GetNumericDataType() == gdal.GDT_Float64 assert map_attrs['attr_two_doubles'].GetDimensionCount() == 1 assert map_attrs['attr_two_doubles'].GetDimensionsSize()[0] == 2 assert map_attrs['attr_two_doubles'].Read() == (1.25125, 2.125125) assert map_attrs['attr_two_doubles'].ReadAsDouble() == 1.25125 assert map_attrs['attr_enum_ubyte'].GetDataType().GetNumericDataType() == gdal.GDT_Byte assert map_attrs['attr_enum_ubyte'].Read() == 1 assert map_attrs['attr_enum_int'].GetDataType().GetNumericDataType() == gdal.GDT_Int32 assert map_attrs['attr_enum_int'].Read() == 1000000001 assert len(map_attrs['attr_custom_type_2_elts'].ReadAsRaw()) == 8 # Compound type contains a string with gdaltest.error_handler(): assert not map_attrs['attr_custom_with_string'].ReadAsRaw() def test_hdf5_multidim_nodata_unit(): ds = gdal.OpenEx('HDF5:data/netcdf/trmm-nc4.nc', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() ar = rg.OpenMDArray('pcp') assert struct.unpack('f', ar.GetNoDataValueAsRaw())[0] == struct.unpack('f', struct.pack('f', -9999.9))[0] assert ar.GetUnit() == '' ar = rg.OpenMDArray('longitude') assert ar.GetNoDataValueAsRaw() is None assert ar.GetUnit() == 'degrees_east' def test_hdf5_multidim_recursive_groups(): # File generated with # import h5py # f = h5py.File('hdf5/recursive_groups.h5','w') # group = f.create_group("subgroup") # group['link_to_root'] = f # group['link_to_self'] = group # group['soft_link_to_root'] = h5py.SoftLink('/') # group['soft_link_to_self'] = h5py.SoftLink('/subgroup') # group['soft_link_to_not_existing'] = h5py.SoftLink('/not_existing') # group['hard_link_to_root'] = h5py.HardLink('/') # group['ext_link_to_self_root'] = h5py.ExternalLink("hdf5/recursive_groups.h5", "/") # f.close() ds = gdal.OpenEx('data/hdf5/recursive_groups.h5', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() assert rg.GetGroupNames() == ['subgroup'] def test_hdf5_netcdf_dimensions(): ds = gdal.OpenEx('HDF5:data/netcdf/trmm-nc4.nc', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() assert rg.GetAttribute('CDI') dims = rg.GetDimensions() assert len(dims) == 3 assert dims[0].GetFullName() == '/latitude' assert dims[0].GetName() == 'latitude' assert dims[0].GetSize() == 40 var = dims[0].GetIndexingVariable() assert var assert var.GetName() == 'latitude' assert dims[1].GetFullName() == '/longitude' assert dims[1].GetName() == 'longitude' assert dims[1].GetSize() == 40 var = dims[1].GetIndexingVariable() assert var assert dims[2].GetFullName() == '/time' assert dims[2].GetName() == 'time' assert dims[2].GetSize() == 1 var = dims[2].GetIndexingVariable() assert var ar = rg.OpenMDArray('latitude') dims = ar.GetDimensions() assert len(dims) == 1 assert dims[0].GetName() == 'latitude' assert dims[0].GetIndexingVariable() assert dims[0].GetIndexingVariable().GetName() == 'latitude' ar = rg.OpenMDArray('pcp') dims = ar.GetDimensions() assert len(dims) == 3 assert dims[0].GetName() == 'time' assert dims[0].GetIndexingVariable() assert dims[0].GetIndexingVariable().GetName() == 'time' def test_hdf5_multidim_netcdf_dimensions_complex_case(): ds = gdal.OpenEx('HDF5:data/netcdf/alldatatypes.nc', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() dims = rg.GetDimensions() assert len(dims) == 6 dim = next((x for x in dims if x.GetName() == 'X'), None) assert dim assert dim.GetFullName() == '/X' assert dim.GetSize() == 2 assert dim.GetIndexingVariable() assert dim.GetIndexingVariable().GetFullName() == '/X' dim = next((x for x in dims if x.GetName() == 'Y'), None) assert dim assert dim.GetFullName() == '/Y' assert dim.GetSize() == 1 assert dim.GetIndexingVariable() assert dim.GetIndexingVariable().GetFullName() == '/Y' dim = next((x for x in dims if x.GetName() == 'X2'), None) assert dim assert dim.GetFullName() == '/X2' assert dim.GetSize() == 4 assert not dim.GetIndexingVariable() assert 'X' in rg.GetMDArrayNames() assert 'X2' not in rg.GetMDArrayNames() subgroup = rg.OpenGroup('group') assert subgroup dims = subgroup.GetDimensions() assert len(dims) == 2 dim = next((x for x in dims if x.GetName() == 'X'), None) assert dim assert dim.GetFullName() == '/group/X' assert dim.GetSize() == 3 assert not dim.GetIndexingVariable() dim = next((x for x in dims if x.GetName() == 'Y'), None) assert dim assert dim.GetFullName() == '/group/Y' assert dim.GetSize() == 2 assert not dim.GetIndexingVariable() ar = subgroup.OpenMDArray('char_var') assert ar dims = ar.GetDimensions() assert len(dims) == 3 assert dims[0].GetFullName() == '/Y' assert dims[0].GetSize() == 1 assert dims[0].GetIndexingVariable() assert dims[1].GetFullName() == '/group/Y' assert dims[1].GetSize() == 2 assert not dims[1].GetIndexingVariable() assert dims[2].GetFullName() == '/group/X' assert dims[2].GetSize() == 3 assert not dims[2].GetIndexingVariable() ar = rg.OpenMDArray('ubyte_z2_y2_x2_var') assert ar dims = ar.GetDimensions() assert len(dims) == 3 assert dims[0].GetFullName() == '/Z2' assert not dims[0].GetIndexingVariable() def test_hdf5_multidim_dimension_labels_with_null(): ds = gdal.OpenEx('data/hdf5/dimension_labels_with_null.h5', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() ar = rg.OpenMDArray('data') attr = ar.GetAttribute('DIMENSION_LABELS') assert attr.ReadAsStringArray() == ['', '', 'x'] ds = gdal.OpenEx('data/hdf5/dimension_labels_with_null.h5', gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() ar = rg.OpenMDArray('data') dims = ar.GetDimensions() assert len(dims) == 3 assert dims[0].GetName() == 'dim0' assert dims[1].GetName() == 'dim1' assert dims[2].GetName() == 'x' def test_hdf5_multidim_family_driver(): assert gdal.OpenEx('data/hdf5/test_family_0.h5', gdal.OF_MULTIDIM_RASTER) gdalautotest-3.2.2/gdrivers/png.py0000775000175000017500000002433314020414367015670 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: png.py ada4469c9470977a9f62f0822417b101af9cfb9e 2020-05-10 18:26:17 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for PNG driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Read test of simple byte reference data. def test_png_1(): tst = gdaltest.GDALTest('PNG', 'png/test.png', 1, 57921) return tst.testOpen() ############################################################################### # Test lossless copying. def test_png_2(): tst = gdaltest.GDALTest('PNG', 'png/test.png', 1, 57921) return tst.testCreateCopy() ############################################################################### # Verify the geotransform, colormap, and nodata setting for test file. def test_png_3(): ds = gdal.Open('data/png/test.png') cm = ds.GetRasterBand(1).GetRasterColorTable() assert cm.GetCount() == 16 and cm.GetColorEntry(0) == (255, 255, 255, 0) and cm.GetColorEntry(1) == (255, 255, 208, 255), \ 'Wrong colormap entries' cm = None assert int(ds.GetRasterBand(1).GetNoDataValue()) == 0, 'Wrong nodata value.' # This geotransform test is also verifying the fix for bug 1414, as # the world file is in a mixture of numeric representations for the # numbers. (mixture of "," and "." in file) gt_expected = (700000.305, 0.38, 0.01, 4287500.695, -0.01, -0.38) gt = ds.GetGeoTransform() for i in range(6): if gt[i] != pytest.approx(gt_expected[i], abs=0.0001): print('expected:', gt_expected) print('got:', gt) pytest.fail('Mixed locale world file read improperly.') ############################################################################### # Test RGB mode creation and reading. def test_png_4(): tst = gdaltest.GDALTest('PNG', 'rgbsmall.tif', 3, 21349) return tst.testCreateCopy() ############################################################################### # Test RGBA 16bit read support. def test_png_5(): tst = gdaltest.GDALTest('PNG', 'png/rgba16.png', 3, 1815) return tst.testOpen() ############################################################################### # Test RGBA 16bit mode creation and reading. def test_png_6(): tst = gdaltest.GDALTest('PNG', 'png/rgba16.png', 4, 4873) return tst.testCreateCopy() ############################################################################### # Test RGB NODATA_VALUES metadata write (and read) support. # This is handled via the tRNS block in PNG. def test_png_7(): drv = gdal.GetDriverByName('PNG') srcds = gdal.Open('data/png/tbbn2c16.png') dstds = drv.CreateCopy('tmp/png7.png', srcds) srcds = None dstds = gdal.Open('tmp/png7.png') md = dstds.GetMetadata() dstds = None assert md['NODATA_VALUES'] == '32639 32639 32639', 'NODATA_VALUES wrong' dstds = None drv.Delete('tmp/png7.png') ############################################################################### # Test PNG file with broken IDAT chunk. This poor man test of clean # recovery from errors caused by reading broken file.. def test_png_8(): drv = gdal.GetDriverByName('PNG') ds_src = gdal.Open('data/png/idat_broken.png') md = ds_src.GetMetadata() assert not md, 'metadata list not expected' # Number of bands has been preserved assert ds_src.RasterCount == 4, 'wrong number of bands' # No reading is performed, so we expect valid reference b = ds_src.GetRasterBand(1) assert b is not None, 'band 1 is missing' # We're not interested in returned value but internal state of GDAL. gdal.PushErrorHandler('CPLQuietErrorHandler') b.ComputeBandStats() err = gdal.GetLastErrorNo() gdal.PopErrorHandler() assert err != 0, 'error condition expected' gdal.PushErrorHandler('CPLQuietErrorHandler') ds_dst = drv.CreateCopy('tmp/idat_broken.png', ds_src) err = gdal.GetLastErrorNo() gdal.PopErrorHandler() ds_src = None assert err != 0, 'error condition expected' assert ds_dst is None, 'dataset not expected' os.remove('tmp/idat_broken.png') ############################################################################### # Test creating an in memory copy. def test_png_9(): tst = gdaltest.GDALTest('PNG', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test writing to /vsistdout/ def test_png_10(): src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('PNG').CreateCopy('/vsistdout_redirect//vsimem/tmp.png', src_ds) assert ds.GetRasterBand(1).Checksum() == 0 src_ds = None ds = None ds = gdal.Open('/vsimem/tmp.png') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672 gdal.Unlink('/vsimem/tmp.png') ############################################################################### # Test CreateCopy() interruption def test_png_11(): tst = gdaltest.GDALTest('PNG', 'byte.tif', 1, 4672) ret = tst.testCreateCopy(vsimem=1, interrupt_during_copy=True) gdal.Unlink('/vsimem/byte.tif.tst') return ret ############################################################################### # Test optimized IRasterIO def test_png_12(): ds = gdal.Open('../gcore/data/stefan_full_rgba.png') cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] # Band interleaved data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) tmp_ds = gdal.GetDriverByName('Mem').Create('', ds.RasterXSize, ds.RasterYSize, ds.RasterCount) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert cs == got_cs # Pixel interleaved data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=ds.RasterCount, buf_band_space=1) tmp_ds = gdal.GetDriverByName('Mem').Create('', ds.RasterXSize, ds.RasterYSize, ds.RasterCount) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=ds.RasterCount, buf_band_space=1) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert cs == got_cs # Pixel interleaved with padding data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_pixel_space=5, buf_band_space=1) tmp_ds = gdal.GetDriverByName('Mem').Create('', ds.RasterXSize, ds.RasterYSize, ds.RasterCount) tmp_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_pixel_space=5, buf_band_space=1) got_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert cs == got_cs ############################################################################### # Test metadata def test_png_13(): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetMetadataItem('foo', 'bar') src_ds.SetMetadataItem('COPYRIGHT', 'copyright value') src_ds.SetMetadataItem('DESCRIPTION', 'will be overridden by creation option') out_ds = gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds, options=['WRITE_METADATA_AS_TEXT=YES', 'DESCRIPTION=my desc']) md = out_ds.GetMetadata() assert len(md) == 3 and md['foo'] == 'bar' and md['Copyright'] == 'copyright value' and md['Description'] == 'my desc' out_ds = None # check that no PAM file is created assert gdal.VSIStatL('/vsimem/tmp.png.aux.xml') != 0 gdal.Unlink('/vsimem/tmp.png') ############################################################################### # Test support for nbits < 8 def test_png_14(): src_ds = gdal.Open('../gcore/data/oddsize1bit.tif') expected_cs = src_ds.GetRasterBand(1).Checksum() gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds) out_ds = gdal.Open('/vsimem/tmp.png') cs = out_ds.GetRasterBand(1).Checksum() nbits = out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') gdal.Unlink('/vsimem/tmp.png') assert cs == expected_cs assert nbits == '1' # check that no PAM file is created assert gdal.VSIStatL('/vsimem/tmp.png.aux.xml') != 0 # Test explicit NBITS gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds, options=['NBITS=2']) out_ds = gdal.Open('/vsimem/tmp.png') nbits = out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') gdal.Unlink('/vsimem/tmp.png') assert nbits == '2' # Test (wrong) explicit NBITS with gdaltest.error_handler(): gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tmp.png', src_ds, options=['NBITS=7']) out_ds = gdal.Open('/vsimem/tmp.png') nbits = out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') gdal.Unlink('/vsimem/tmp.png') assert nbits is None gdalautotest-3.2.2/gdrivers/jp2kak.py0000775000175000017500000003506114020414367016266 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: jp2kak.py b6c71e69565f9e1a99d8ad3a3c7ac8903904e49f 2020-10-09 14:54:43 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for JP2KAK JPEG2000 driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest pytestmark = pytest.mark.require_driver('JP2KAK') ############################################################################### @pytest.fixture(autouse=True, scope='module') def startup_and_cleanup(): gdaltest.jp2kak_drv = gdal.GetDriverByName('JP2KAK') assert gdaltest.jp2kak_drv is not None gdaltest.deregister_all_jpeg2000_drivers_but('JP2KAK') yield gdaltest.reregister_all_jpeg2000_drivers() ############################################################################### # Read test of simple byte reference data. def test_jp2kak_1(): tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/byte.jp2', 1, 50054) return tst.testOpen() ############################################################################### # Read test of simple 16bit reference data. def test_jp2kak_2(): tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/int16.jp2', 1, 4587) return tst.testOpen() ############################################################################### # Test lossless copying. def test_jp2kak_3(): tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/byte.jp2', 1, 50054, options=['QUALITY=100']) return tst.testCreateCopy() ############################################################################### # Test GeoJP2 production with geotransform. def test_jp2kak_4(): tst = gdaltest.GDALTest('JP2KAK', 'rgbsmall.tif', 0, 0, options=['GMLJP2=OFF']) return tst.testCreateCopy(check_srs=1, check_gt=1) ############################################################################### # Test GeoJP2 production with gcps. def test_jp2kak_5(): tst = gdaltest.GDALTest('JP2KAK', 'rgbsmall.tif', 0, 0, options=['GEOJP2=OFF']) return tst.testCreateCopy(check_srs=1, check_gt=1) ############################################################################### # Test VSI*L support with a JPC rather than jp2 datastream. # def test_jp2kak_8(): tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/byte.jp2', 1, 50054, options=['QUALITY=100']) return tst.testCreateCopy(vsimem=1, new_filename='/vsimem/jp2kak_8.jpc') ############################################################################### # Test checksum values for a YCbCr color model file. # def test_jp2kak_9(): tst = gdaltest.GDALTest('JP2KAK', 'jpeg2000/rgbwcmyk01_YeGeo_kakadu.jp2', 2, 32141) return tst.testOpen() ############################################################################### # Confirm that we can also read this file using the DirectRasterIO() # function and get appropriate values. # def test_jp2kak_10(): ds = gdal.Open('data/jpeg2000/rgbwcmyk01_YeGeo_kakadu.jp2') data = ds.ReadRaster(0, 0, 800, 100, band_list=[2, 3]).decode('latin1') ds = None expected = [(0, 0), (255, 0), (0, 255), (255, 255), (255, 255), (0, 255), (255, 0), (0, 0)] got = [] for x in range(8): got.append((ord(data[x * 100]), ord(data[80000 + x * 100]))) assert got == expected, 'did not get expected values.' ############################################################################### # Test handle of 11bit signed file. # def test_jp2kak_11(): ds = gdal.Open('data/jpeg2000/gtsmall_11_int16.jp2') cs = ds.GetRasterBand(1).Checksum() assert cs in (63475, 63472, 63452, 63471) ############################################################################### # Test handle of 10bit unsigned file. # def test_jp2kak_12(): ds = gdal.Open('data/jpeg2000/gtsmall_10_uint16.jp2') cs = ds.GetRasterBand(1).Checksum() assert cs == 63360 or cs == 63357 or cs == 63358 ############################################################################### # Test internal overviews. # def test_jp2kak_13(): src_ds = gdal.Open('data/pcidsk/utm.pix') jp2_ds = gdaltest.jp2kak_drv.CreateCopy('tmp/jp2kak_13.jp2', src_ds) src_ds = None jp2_band = jp2_ds.GetRasterBand(1) assert jp2_band.GetOverviewCount() == 1, \ 'did not get expected number of overviews on jp2' ov_band = jp2_band.GetOverview(0) assert ov_band.XSize == 250 and ov_band.YSize == 4, \ 'did not get expected overview size.' # Note, due to oddities of rounding related to identifying discard # levels the overview is actually generated with no discard levels # and in the debug output we see 500x7 -> 500x7 -> 250x4. checksum = ov_band.Checksum() assert checksum in (11776, 11736, 11801), 'did not get expected overview checksum' ############################################################################### # Test external overviews. # def test_jp2kak_14(): jp2_ds = gdal.Open('tmp/jp2kak_13.jp2') jp2_ds.BuildOverviews('NEAREST', overviewlist=[2, 4]) jp2_band = jp2_ds.GetRasterBand(1) assert jp2_band.GetOverviewCount() == 2, \ 'did not get expected number of overviews on jp2' ov_band = jp2_band.GetOverview(0) assert ov_band.XSize == 250 and ov_band.YSize == 4, \ 'did not get expected overview size.' checksum = ov_band.Checksum() assert checksum in (12288, 12272, 12224), 'did not get expected overview checksum' ov_band = jp2_band.GetOverview(1) assert ov_band.XSize == 125 and ov_band.YSize == 2, \ 'did not get expected overview size. (2)' checksum = ov_band.Checksum() assert checksum in (2957, 2980, 2990), 'did not get expected overview checksum (2)' jp2_ds = None gdaltest.jp2kak_drv.Delete('tmp/jp2kak_13.jp2') ############################################################################### # Confirm we can read resolution information. # def test_jp2kak_15(): jp2_ds = gdal.Open('data/jpeg2000/small_200ppcm.jp2') md = jp2_ds.GetMetadata() assert (not (md['TIFFTAG_RESOLUTIONUNIT'] != '3 (pixels/cm)' or md['TIFFTAG_XRESOLUTION'] != '200.012')), \ 'did not get expected resolution metadata' jp2_ds = None ############################################################################### # Confirm we can write and then reread resolution information. # def test_jp2kak_16(): jp2_ds = gdal.Open('data/jpeg2000/small_200ppcm.jp2') out_ds = gdaltest.jp2kak_drv.CreateCopy('tmp/jp2kak_16.jp2', jp2_ds) del out_ds jp2_ds = None jp2_ds = gdal.Open('tmp/jp2kak_16.jp2') md = jp2_ds.GetMetadata() assert (not (md['TIFFTAG_RESOLUTIONUNIT'] != '3 (pixels/cm)' or md['TIFFTAG_XRESOLUTION'] != '200.012')), \ 'did not get expected resolution metadata' jp2_ds = None gdaltest.jp2kak_drv.Delete('tmp/jp2kak_16.jp2') ############################################################################### # Test reading a file with axis orientation set properly for an alternate # axis order coordinate system (urn:...:EPSG::4326). # In addition, the source .jp2 file's embedded GML has the alternate order # between the offsetVector tags, and the "GDAL_JP2K_ALT_OFFSETVECTOR_ORDER" # option is turned on to match that situation. # This test case was adapted from the "jp2kak_7()" case above. def test_jp2kak_17(): gdal.SetConfigOption('GDAL_JP2K_ALT_OFFSETVECTOR_ORDER', 'YES') ds = gdal.Open('data/jpeg2000/gmljp2_dtedsm_epsg_4326_axes_alt_offsetVector.jp2') gt = ds.GetGeoTransform() gte = (42.999583333333369, 0.008271349862259, 0, 34.000416666666631, 0, -0.008271349862259) if (gt[0] != pytest.approx(gte[0], abs=0.0000001) or gt[3] != pytest.approx(gte[3], abs=0.000001) or gt[1] != pytest.approx(gte[1], abs=0.000000000005) or gt[2] != pytest.approx(gte[2], abs=0.000000000005) or gt[4] != pytest.approx(gte[4], abs=0.000000000005) or gt[5] != pytest.approx(gte[5], abs=0.000000000005)): print('got: ', gt) gdal.SetConfigOption('GDAL_JP2K_ALT_OFFSETVECTOR_ORDER', 'NO') pytest.fail('did not get expected geotransform') ds = None gdal.SetConfigOption('GDAL_JP2K_ALT_OFFSETVECTOR_ORDER', 'NO') ############################################################################### # Test lossless copying of Int16 def test_jp2kak_18(): tst = gdaltest.GDALTest('JP2KAK', 'int16.tif', 1, 4672, options=['QUALITY=100']) return tst.testCreateCopy() ############################################################################### # Test lossless copying of UInt16 def test_jp2kak_19(): tst = gdaltest.GDALTest('JP2KAK', '../gcore/data/uint16.tif', 1, 4672, options=['QUALITY=100'], filename_absolute=1) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit def test_jp2kak_20(): ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) # jp2_fourth_band_data = fourth_band.ReadRaster( # 0, 0, ds.RasterXSize, ds.RasterYSize) fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) tiff_drv = gdal.GetDriverByName('GTiff') tmp_ds = tiff_drv.CreateCopy('/vsimem/jp2kak_20.tif', ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) # gtiff_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, # ds.RasterYSize) # gtiff_fourth_band_subsampled_data = fourth_band.ReadRaster( # 0, 0, ds.RasterXSize, ds.RasterYSize, # ds.RasterXSize/16, ds.RasterYSize/16) tmp_ds = None tiff_drv.Delete('/vsimem/jp2kak_20.tif') assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data # if jp2_fourth_band_data != gtiff_fourth_band_data: # gdaltest.post_reason('fail') # return 'fail' ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ############################################################################### # Test non nearest upsampling def test_jp2kak_21(): tmp_ds = gdaltest.jp2kak_drv.CreateCopy( '/vsimem/jp2kak_21.jp2', gdal.Open('data/int16.tif'), options=['QUALITY=100']) tmp_ds = None tmp_ds = gdal.Open('/vsimem/jp2kak_21.jp2') full_res_data = tmp_ds.ReadRaster(0, 0, 20, 20) upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic) tmp_ds = None gdal.Unlink('/vsimem/jp2kak_21.jp2') tmp_ds = gdal.GetDriverByName('MEM').Create('', 20, 20, 1, gdal.GDT_Int16) tmp_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, full_res_data) ref_upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic) mem_ds = gdal.GetDriverByName('MEM').Create('', 40, 40, 1, gdal.GDT_Int16) mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, ref_upsampled_data) ref_cs = mem_ds.GetRasterBand(1).Checksum() mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, upsampled_data) cs = mem_ds.GetRasterBand(1).Checksum() assert cs == ref_cs ############################################################################### # Test RGBA datasets def test_jp2kak_22(): src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') gdaltest.jp2kak_drv.CreateCopy('/vsimem/jp2kak_22.jp2', src_ds, options=['QUALITY=100']) ds = gdal.Open('/vsimem/jp2kak_22.jp2') for i in range(4): ref_cs = src_ds.GetRasterBand(1).Checksum() cs = ds.GetRasterBand(1).Checksum() assert ref_cs == cs, i assert src_ds.GetRasterBand(1).GetColorInterpretation() == ds.GetRasterBand(1).GetColorInterpretation(), \ i ds = None gdal.Unlink('/vsimem/jp2kak_22.jp2') ############################################################################### # Test accessing overview levels when the dimensions of the full resolution # image are not a multiple of 2^numresolutions def test_jp2kak_odd_dimensions(): ds = gdal.Open('data/jpeg2000/513x513.jp2') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None assert cs == 29642 ############################################################################### # Test reading an image whose origin is not (0,0) def test_jp2kak_image_origin_not_zero(): ds = gdal.Open('data/jpeg2000/byte_image_origin_not_zero.jp2') assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).ReadRaster(0,0,20,20,10,10) is not None gdalautotest-3.2.2/gdrivers/isce.py0000775000175000017500000000653414020414367016032 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: isce.py 8c9cad1a7b261a0e9ce97762509cdb2c49d3450b 2020-05-10 15:45:57 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ISCE format driver. # Author: Matthieu Volat # ############################################################################### # Copyright (c) 2014, Matthieu Volat # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Perform simple read test. def test_isce_1(): tst = gdaltest.GDALTest('isce', 'isce/isce.slc', 1, 350) prj = """GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4326"]]""" return tst.testOpen(check_prj=prj, check_gt=(14.259166666666667, 0.0008333333333333334, 0.0, 38.22083333333333, 0.0, -0.0008333333333333334)) ############################################################################### # Test reading of metadata from the ISCE metadata domain def test_isce_2(): ds = gdal.Open('data/isce/isce.slc') val = ds.GetMetadataItem('IMAGE_TYPE', 'ISCE') assert val == 'slc' ############################################################################### # Verify this can be exported losslessly. def test_isce_3(): tst = gdaltest.GDALTest('isce', 'isce/isce.slc', 1, 350) return tst.testCreateCopy(check_gt=0, new_filename='isce.tst.slc') ############################################################################### # Verify VSIF*L capacity def test_isce_4(): tst = gdaltest.GDALTest('isce', 'isce/isce.slc', 1, 350) return tst.testCreateCopy(check_gt=0, new_filename='isce.tst.slc', vsimem=1) gdalautotest-3.2.2/gdrivers/pds4.py0000775000175000017500000015150314020414367015756 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: pds4.py 2294f1c0fc590608863f4499c7a56353cd37eaa2 2021-01-09 21:36:51 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test PDS4 format # Author: Even Rouault, # ############################################################################### # Copyright (c) 2017, Hobu Inc # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import contextlib import os import struct from osgeo import gdal from osgeo import ogr from osgeo import osr import gdaltest import pytest ############################################################################### # Validate XML file against schemas def validate_xml(filename): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1D00.xsd', 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1D00.xsd', force_download=True): pytest.skip() if not gdaltest.download_file('https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1D00_1933.xsd', 'pds.nasa.gov_pds4_cart_v1_PDS4_CART_1D00_1933.xsd', force_download=True): pytest.skip() if not gdaltest.download_file('https://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1B00.xsd', 'pds.nasa.gov_pds4_disp_v1_PDS4_DISP_1B00.xsd', force_download=True): pytest.skip() if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1B00.xsd', 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1B00.xsd', force_download=True): pytest.skip() # Needed by PDS4_CART_1D00_1933 if not gdaltest.download_file('https://pds.nasa.gov/pds4/geom/v1/PDS4_GEOM_1B10_1700.xsd', 'pds.nasa.gov_pds4_geom_v1_PDS4_GEOM_1B10_1700.xsd', force_download=True): pytest.skip() if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1B10.xsd', 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1B10.xsd', force_download=True): pytest.skip() # Older schemas if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.xsd', 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1800.xsd', force_download=True): pytest.skip() if not gdaltest.download_file('https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1700.xsd', 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1700.xsd', force_download=True): pytest.skip() if not gdaltest.download_file('https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1700.xsd', 'pds.nasa.gov_pds4_cart_v1_PDS4_CART_1700.xsd', force_download=True): pytest.skip() ds = gdal.OpenEx('GMLAS:' + filename, open_options=[ 'VALIDATE=YES', 'FAIL_IF_VALIDATION_ERROR=YES', 'CONFIG_FILE=falsetmp/cache']) return ds is not None ############################################################################### # Perform simple read test on PDS4 dataset. def test_pds4_read_cart_1700(): srs = """PROJCS["Transverse Mercator Earth", GEOGCS["GCS_Earth", DATUM["D_North_American_Datum_1927", SPHEROID["North_American_Datum_1927",6378206.4,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",0], PARAMETER["false_northing",0],UNIT["meter",1]] """ gt = (-59280.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('PDS4', 'pds4/byte_pds4_cart_1700.xml', 1, 4672) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Perform simple read test on PDS4 dataset. def test_pds4_read_cart_1B00(): srs = """PROJCS["Transverse Mercator Earth", GEOGCS["GCS_Earth", DATUM["D_North_American_Datum_1927", SPHEROID["North_American_Datum_1927",6378206.4,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",0], PARAMETER["false_northing",0],UNIT["meter",1]] """ gt = (-59280.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('PDS4', 'pds4/byte_pds4_cart_1b00.xml', 1, 4672) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Perform simple read test on PDS4 dataset. def test_pds4_read_cart_1D00_1933(): srs = """PROJCS["Transverse Mercator Earth", GEOGCS["GCS_Earth", DATUM["D_North_American_Datum_1927", SPHEROID["North_American_Datum_1927",6378206.4,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",0], PARAMETER["false_northing",0],UNIT["meter",1]] """ gt = (-59280.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('PDS4', 'pds4/byte_pds4_cart_1d00_1933.xml', 1, 4672) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # hide_substitution_warnings_error_handler() def hide_substitution_warnings_error_handler_cbk(typ, errno, msg): # pylint: disable=unused-argument if 'substituted' not in msg and 'VAR_TITLE not defined' not in msg: print(msg) @contextlib.contextmanager def hide_substitution_warnings_error_handler(): handler = gdal.PushErrorHandler(hide_substitution_warnings_error_handler_cbk) try: yield handler finally: gdal.PopErrorHandler() ############################################################################### # Test CreateCopy() with defaults def test_pds4_2(): tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret ############################################################################### def test_pds4_write_utm(): src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): gdal.GetDriverByName('PDS4').CreateCopy('/vsimem/temp.xml', src_ds) ds = gdal.Open('/vsimem/temp.xml') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None f = gdal.VSIFOpenL('/vsimem/temp.xml', 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '-117.6411686' in data, data assert '-117.6281108' in data, data assert '33.90241956' in data, data assert '33.891530168' in data, data gdal.GetDriverByName('PDS4').Delete('/vsimem/temp.xml') ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BSQ def test_pds4_3(): tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BSQ']) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BIP def test_pds4_4(): tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BIP']) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BIL def test_pds4_5(): tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BIL']) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BSQ and IMAGE_FORMAT=GEOTIFF def test_pds4_6(): tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BSQ', 'IMAGE_FORMAT=GEOTIFF']) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret ############################################################################### # Test CreateCopy() with explicit INTERLEAVE=BIP and IMAGE_FORMAT=GEOTIFF def test_pds4_7(): tst = gdaltest.GDALTest('PDS4', 'rgbsmall.tif', 2, 21053, options=['INTERLEAVE=BIP', 'IMAGE_FORMAT=GEOTIFF']) with hide_substitution_warnings_error_handler(): ret = tst.testCreateCopy(vsimem=1, strict_in=1, quiet_error_handler=False) return ret ############################################################################### # Test SRS support def test_pds4_8(): filename = '/vsimem/out.xml' for proj4 in ['+proj=eqc +lat_ts=43.75 +lat_0=10 +lon_0=-112.5 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', '+proj=lcc +lat_1=10 +lat_0=10 +lon_0=-112.5 +k_0=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # LCC_1SP '+proj=lcc +lat_0=10 +lon_0=-112.5 +lat_1=9 +lat_2=11 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # LCC_2SP '+proj=omerc +lat_0=10 +lonc=11 +alpha=12 +gamma=12 +k=1 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # Oblique Mercator Azimuth Center '+proj=omerc +lat_0=10 +lat_1=12 +lon_1=11 +lat_2=14 +lon_2=13 +k=1 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # Oblique Mercator 2 points '+proj=stere +lat_0=90 +lon_0=10 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', # Polar Stereographic '+proj=poly +lat_0=9 +lon_0=10 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', '+proj=sinu +lon_0=10 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', '+proj=tmerc +lat_0=11 +lon_0=10 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', '+proj=merc +lat_ts=2 +lon_0=3 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', '+proj=merc +lon_0=3 +k=0.9 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', '+proj=ortho +lat_0=1 +lon_0=2 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', '+proj=laea +lat_0=1 +lon_0=2 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs', ]: ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1) sr = osr.SpatialReference() sr.ImportFromProj4(proj4) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) with gdaltest.error_handler(): ds = None ret = validate_xml(filename) assert ret, ('validation of file for %s failed' % proj4) ds = gdal.Open(filename) wkt = ds.GetProjectionRef() sr = osr.SpatialReference() sr.SetFromUserInput(wkt) got_proj4 = sr.ExportToProj4().strip() assert got_proj4 == proj4, '' # longlat doesn't roundtrip as such ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) with gdaltest.error_handler(): ds = None ds = gdal.Open(filename) wkt = ds.GetProjectionRef() sr = osr.SpatialReference() sr.SetFromUserInput(wkt) got_proj4 = sr.ExportToProj4().strip() proj4 = '+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R=2439400 +units=m +no_defs' assert got_proj4 == proj4, '' got_gt = ds.GetGeoTransform() expected_gt = (85151.12354629935, 42575.561773149675, 0.0, 2086202.5268843342, 0.0, -85151.12354629935) assert max([abs(got_gt[i] - expected_gt[i]) for i in range(6)]) <= 1, '' ds = None gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test nodata / mask def test_pds4_9(): ds = gdal.Open('data/pds4/byte_pds4_cart_1700.xml') ndv = ds.GetRasterBand(1).GetNoDataValue() assert ndv == 74 cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 4800 ds = None filename = '/vsimem/out.xml' # Test copy of all specialConstants with hide_substitution_warnings_error_handler(): gdal.Translate(filename, 'data/pds4/byte_pds4_cart_1700.xml', format='PDS4') ret = validate_xml(filename) assert ret, 'validation failed' ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() assert ndv == 74 cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 4800 ds = None filename = '/vsimem/out.xml' # Test copy of all specialConstants and override noData for frmt in ['RAW', 'GEOTIFF']: with hide_substitution_warnings_error_handler(): gdal.Translate(filename, 'data/pds4/byte_pds4_cart_1700.xml', format='PDS4', noData=75, creationOptions=['IMAGE_FORMAT=' + frmt]) ret = validate_xml(filename) assert ret, 'validation failed' ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() assert ndv == 75 flag = ds.GetRasterBand(1).GetMaskFlags() assert flag == 0 cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 4833 ds = None # Test just setting noData for frmt in ['RAW', 'GEOTIFF']: with hide_substitution_warnings_error_handler(): gdal.Translate(filename, 'data/pds4/byte_pds4_cart_1700.xml', format='PDS4', creationOptions=['USE_SRC_LABEL=NO', 'IMAGE_FORMAT=' + frmt]) ret = validate_xml(filename) assert ret, 'validation failed' ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() assert ndv == 74, frmt ds = None # Test filling with nodata ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['IMAGE_FORMAT=' + frmt]) ds.GetRasterBand(1).SetNoDataValue(1) with hide_substitution_warnings_error_handler(): ds = None ds = gdal.Open(filename) cs = ds.GetRasterBand(1).Checksum() assert cs == 1, frmt ds = None # Test setting nodata and then explicit Fill() ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['IMAGE_FORMAT=' + frmt]) ds.GetRasterBand(1).SetNoDataValue(10) ds.GetRasterBand(1).Fill(1) with hide_substitution_warnings_error_handler(): ds = None ds = gdal.Open(filename) cs = ds.GetRasterBand(1).Checksum() assert cs == 1, frmt ds = None template = '/vsimem/template.xml' # Empty Special_Constants gdal.FileFromMemBuffer(template, """ ${LOGICAL_IDENTIFIER} 1.0 ${TITLE} 1.8.0.0 Product_Observational ${INVESTIGATION_AREA_NAME} Mission ${INVESTIGATION_AREA_LID_REFERENCE} data_to_investigation ${OBSERVING_SYSTEM_NAME} Spacecraft Earth Planet urn:nasa:pds:context:target:planet.earth data_to_target """) ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=' + template]) ds.GetRasterBand(1).SetNoDataValue(10) with hide_substitution_warnings_error_handler(): ds = None ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() assert ndv == 10 ds = None ret = validate_xml(filename) assert ret, 'validation failed' # Special_Constants with just saturated_constant gdal.FileFromMemBuffer(template, """ ${LOGICAL_IDENTIFIER} 1.0 ${TITLE} 1.8.0.0 Product_Observational ${INVESTIGATION_AREA_NAME} Mission ${INVESTIGATION_AREA_LID_REFERENCE} data_to_investigation ${OBSERVING_SYSTEM_NAME} Spacecraft Earth Planet urn:nasa:pds:context:target:planet.earth data_to_target 255 """) ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=' + template]) ds.GetRasterBand(1).SetNoDataValue(10) with hide_substitution_warnings_error_handler(): ds = None ds = gdal.Open(filename) ndv = ds.GetRasterBand(1).GetNoDataValue() assert ndv == 10 ds = None ret = validate_xml(filename) assert ret, 'validation failed' gdal.GetDriverByName('PDS4').Delete(filename) gdal.Unlink(template) ############################################################################### # Test scale / offset def test_pds4_10(): filename = '/vsimem/out.xml' filename2 = '/vsimem/out2.xml' for frmt in ['RAW', 'GEOTIFF']: ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['IMAGE_FORMAT=' + frmt]) ds.GetRasterBand(1).SetScale(2) ds.GetRasterBand(1).SetOffset(3) with hide_substitution_warnings_error_handler(): ds = None gdal.Translate(filename2, filename, format='PDS4') ds = gdal.Open(filename2) scale = ds.GetRasterBand(1).GetScale() assert scale == 2 offset = ds.GetRasterBand(1).GetOffset() assert offset == 3 ds = None gdal.GetDriverByName('PDS4').Delete(filename) gdal.GetDriverByName('PDS4').Delete(filename2) ############################################################################### # Test various data types def test_pds4_11(): filename = '/vsimem/out.xml' for (dt, data) in [(gdal.GDT_Byte, struct.pack('B', 255)), (gdal.GDT_UInt16, struct.pack('H', 65535)), (gdal.GDT_Int16, struct.pack('h', -32768)), (gdal.GDT_UInt32, struct.pack('I', 4000000000)), (gdal.GDT_Int32, struct.pack('i', -2000000000)), (gdal.GDT_Float32, struct.pack('f', 1.25)), (gdal.GDT_Float64, struct.pack('d', 1.25)), (gdal.GDT_CFloat32, struct.pack('ff', 1.25, 2.5)), (gdal.GDT_CFloat64, struct.pack('dd', 1.25, 2.5))]: ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, dt) ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, data) with hide_substitution_warnings_error_handler(): ds = None with gdaltest.config_option('PDS4_FORCE_MASK', 'YES'): ds = gdal.Open(filename) assert ds.GetRasterBand(1).DataType == dt got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) assert got_data == data, dt cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 3, dt ds = None gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test various creation options def test_pds4_12(): filename = '/vsimem/out.xml' ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['VAR_LOGICAL_IDENTIFIER=logical_identifier', 'VAR_TITLE=title', 'VAR_INVESTIGATION_AREA_NAME=ian', 'VAR_INVESTIGATION_AREA_LID_REFERENCE=ialr', 'VAR_OBSERVING_SYSTEM_NAME=osn', 'VAR_UNUSED=foo', 'TEMPLATE=data/pds4/byte_pds4_cart_1700.xml', 'BOUNDING_DEGREES=1,2,3,4', 'LATITUDE_TYPE=Planetographic', 'LONGITUDE_DIRECTION=Positive West', 'IMAGE_FILENAME=/vsimem/myimage.raw']) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds = None f = gdal.VSIFOpenL(filename, 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'logical_identifier' in data assert '1' in data assert '3' in data assert '4' in data assert '2' in data assert 'Planetographic' in data assert 'Positive West' in data assert 'myimage.raw' in data gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test subdatasets def test_pds4_13(): ds = gdal.Open('data/pds4/byte_pds4_cart_1700_multi_sds.xml') subds = ds.GetSubDatasets() expected_subds = [('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:1', 'Image file byte_pds4_cart_1700.img, array first_sds'), ('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:2', 'Image file byte_pds4_cart_1700.img, array second_sds'), ('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:2:1', 'Image file byte_pds4_cart_1700.img, array third_sds')] assert subds == expected_subds ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:1') cs = ds.GetRasterBand(1).Checksum() assert cs == 2315 ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:2') cs = ds.GetRasterBand(1).Checksum() assert cs == 2302 ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:2:1') cs = ds.GetRasterBand(1).Checksum() assert cs == 3496 ds = gdal.Open(os.path.join(os.getcwd(), 'data', 'pds4', 'byte_pds4_cart_1700_multi_sds.xml')) subds_name = ds.GetSubDatasets()[0][0] ds = gdal.Open(subds_name) assert ds is not None with gdaltest.error_handler(): ds = gdal.Open(r'PDS4:c:\do_not\exist.xml:1:1') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('PDS4:i_do_not_exist.xml') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('PDS4:i_do_not_exist.xml:1:1') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:3:1') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('PDS4:data/pds4/byte_pds4_cart_1700_multi_sds.xml:1:3') assert ds is None ############################################################################### # Test error cases def test_pds4_14(): filename = '/vsimem/test.xml' gdal.FileFromMemBuffer(filename, "Product_Observational http://pds.nasa.gov/pds4/pds/v1") with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None gdal.FileFromMemBuffer(filename, """ i_do_not_exist.img 3 i_do_not_exist.img 3 Last Index Fastest i_do_not_exist.img 3 Last Index Fastest SignedByte x 1 1 Band 0 1 Band 1 0 Band 1 4 Band 1 1 Band 1 1 """) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None gdal.FileFromMemBuffer(filename, """ i_do_not_exist.img 3 Last Index Fastest UnsignedByte Band 65537 1 Line 1 2 Sample 1 3 """) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None gdal.FileFromMemBuffer(filename, """ i_do_not_exist.img 2 Last Index Fastest SignedByte Line 1 1 Sample 1 2 """) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None gdal.FileFromMemBuffer(filename, """ i_do_not_exist.img 2 Last Index Fastest ComplexMSB16 Line 1 1 Sample 2000000000 2 """) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None gdal.FileFromMemBuffer(filename, """ i_do_not_exist.img 2 Last Index Fastest ComplexMSB16 Sample 1 1 Line 2000000000 2 """) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds is None gdal.Unlink(filename) # Invalid value for INTERLEAVE with gdaltest.error_handler(): ds = gdal.GetDriverByName('PDS4').Create('/vsimem/out.xml', 1, 1, options=['INTERLEAVE=INVALID']) assert ds is None # INTERLEAVE=BIL not supported for GeoTIFF in PDS4 with gdaltest.error_handler(): ds = gdal.GetDriverByName('PDS4').Create('/vsimem/out.xml', 1, 1, options=['INTERLEAVE=BIL', 'IMAGE_FORMAT=GEOTIFF']) assert ds is None # Cannot create GeoTIFF file with gdaltest.error_handler(): ds = gdal.GetDriverByName('PDS4').Create('/i/do_not/exist.xml', 1, 1, options=['IMAGE_FORMAT=GEOTIFF']) assert ds is None gdal.Translate('/vsimem/test.tif', 'data/byte.tif') # Output file has same name as input file with gdaltest.error_handler(): ds = gdal.Translate('/vsimem/test.xml', '/vsimem/test.tif', format='PDS4', creationOptions=['IMAGE_FORMAT=GEOTIFF']) assert ds is None gdal.Unlink('/vsimem/test.tif') template = '/vsimem/template.xml' # Missing Product_Observational root gdal.FileFromMemBuffer(template, """""") ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=' + template]) gdal.ErrorReset() with gdaltest.error_handler(): ds = None assert gdal.GetLastErrorMsg() == 'Cannot find Product_Observational element in template' # Missing Target_Identification gdal.FileFromMemBuffer(template, """ """) ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=' + template]) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) gdal.ErrorReset() with gdaltest.error_handler(): ds = None assert gdal.GetLastErrorMsg() == 'Cannot find Target_Identification element in template' # Missing Observation_Area gdal.FileFromMemBuffer(template, """ """) ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=' + template]) gdal.ErrorReset() with gdaltest.error_handler(): ds = None assert gdal.GetLastErrorMsg() == 'Cannot find Observation_Area in template' # Unexpected content found after Observation_Area in template gdal.FileFromMemBuffer(template, """ """) ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=' + template]) gdal.ErrorReset() with gdaltest.error_handler(): ds = None assert gdal.GetLastErrorMsg() == 'Unexpected content found after Observation_Area in template' gdal.Unlink(template) gdal.Unlink(filename) gdal.Unlink('/vsimem/test.img') ############################################################################### # Test Create() without geospatial info but from a geospatial enabled template def test_pds4_15(): filename = '/vsimem/out.xml' with hide_substitution_warnings_error_handler(): gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=data/pds4/byte_pds4_cart_1700.xml']) ret = validate_xml(filename) assert ret, 'validation failed' f = gdal.VSIFOpenL(filename, 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '' not in data gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test Create() with geospatial info but from a template without Discipline_Area def test_pds4_16(): template = '/vsimem/template.xml' filename = '/vsimem/out.xml' gdal.FileFromMemBuffer(template, """ ${LOGICAL_IDENTIFIER} 1.0 ${TITLE} 1.8.0.0 Product_Observational ${INVESTIGATION_AREA_NAME} Mission ${INVESTIGATION_AREA_LID_REFERENCE} data_to_investigation ${OBSERVING_SYSTEM_NAME} Spacecraft Earth Planet urn:nasa:pds:context:target:planet.earth data_to_target """) ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, options=['TEMPLATE=' + template]) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) with hide_substitution_warnings_error_handler(): ds = None f = gdal.VSIFOpenL(filename, 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) ret = validate_xml(filename) assert ret, ('validation failed: %s' % data) assert 'http://pds.nasa.gov/pds4/pds/v1 https://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.xsd http://pds.nasa.gov/pds4/cart/v1 https://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1700.xsd"' in data assert 'xmlns:cart="http://pds.nasa.gov/pds4/cart/v1"' in data assert '' in data gdal.GetDriverByName('PDS4').Delete(filename) gdal.Unlink(template) ############################################################################### # Test ARRAY_TYPE creation option def test_pds4_17(): filename = '/vsimem/out.xml' with gdaltest.error_handler(): gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, options=['ARRAY_TYPE=Array_2D']) ret = validate_xml(filename) assert ret, 'validation failed' f = gdal.VSIFOpenL(filename, 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert ('' in data and '2' in data and \ 'Band' not in data and \ '3' not in data) gdal.GetDriverByName('PDS4').Delete(filename) # Test multi-band creation with Array_2D with gdaltest.error_handler(): ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 2, options=['ARRAY_TYPE=Array_2D']) assert ds is None, 'expected failure' # Test multi-band creation with Array_3D_Spectrum with gdaltest.error_handler(): gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 2, options=['ARRAY_TYPE=Array_3D_Spectrum']) ret = validate_xml(filename) assert ret, 'validation failed' f = gdal.VSIFOpenL(filename, 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '' in data and '3' in data gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test RADII creation option def test_pds4_18(): filename = '/vsimem/out.xml' ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, options=['RADII=1,2']) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=longlat +R=2439400 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) with gdaltest.error_handler(): ds = None f = gdal.VSIFOpenL(filename, 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert ('1' in data and \ '1' in data and \ '2' in data) gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test APPEND_SUBDATASET=YES @pytest.mark.parametrize('options', [['IMAGE_FORMAT=RAW'], ['IMAGE_FORMAT=GEOTIFF']]) def test_pds4_append_subdataset(options): filename = '/vsimem/out.xml' ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1, options=options) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=tmerc +R=6378137 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds.GetRasterBand(1).Fill(1) ds = None src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) src_ds.GetRasterBand(1).Fill(2) assert gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) ds = gdal.Open(filename) subds = ds.GetSubDatasets() assert len(subds) == 2, subds ds = gdal.Open('PDS4:/vsimem/out.xml:1:1') assert ds.GetRasterBand(1).Checksum() == 1 ds = gdal.Open('PDS4:/vsimem/out.xml:1:2') assert ds.GetRasterBand(1).Checksum() == 2 src_ds.GetRasterBand(1).Fill(3) assert gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) ds = gdal.Open('PDS4:/vsimem/out.xml:1:3') assert ds.GetRasterBand(1).Checksum() == 3 gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test APPEND_SUBDATASET=YES error case def test_pds4_append_subdataset_not_same_gt(): filename = '/vsimem/out.xml' ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=tmerc +R=6378137 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds.GetRasterBand(1).Fill(1) ds = None src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([2.1, 1, 0, 49, 0, -2]) src_ds.GetRasterBand(1).Fill(2) assert not gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### # Test APPEND_SUBDATASET=YES error case def test_pds4_append_subdataset_not_same_srs(): filename = '/vsimem/out.xml' ds = gdal.GetDriverByName('PDS4').Create(filename, 1, 1, 1) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=tmerc +R=6378137 +no_defs') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) ds.GetRasterBand(1).Fill(1) ds = None src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=tmerc +R=1 +no_defs') src_ds.SetProjection(sr.ExportToWkt()) src_ds.SetGeoTransform([2, 1, 0, 49, 0, -2]) src_ds.GetRasterBand(1).Fill(2) assert not gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['APPEND_SUBDATASET=YES']) gdal.GetDriverByName('PDS4').Delete(filename) ############################################################################### def _test_createlabelonly(src_ds, expected_standard_id = None, filename = '/vsimem/out.xml', validate = False): src_ds_name = src_ds.GetDescription() src_driver_name = src_ds.GetDriver().GetDescription() with gdaltest.error_handler(): assert gdal.GetDriverByName('PDS4').CreateCopy(filename, src_ds, options=['CREATE_LABEL_ONLY=YES']) with gdaltest.error_handler(): ds = gdal.Open(filename) assert ds assert src_ds_name in ds.GetFileList() assert ds.RasterCount == src_ds.RasterCount assert ds.RasterXSize == src_ds.RasterXSize assert ds.RasterYSize == src_ds.RasterYSize with gdaltest.error_handler(): for i in range(ds.RasterCount): assert ds.GetRasterBand(i+1).Checksum() == src_ds.GetRasterBand(i+1).Checksum() ds = None src_ds = None if validate: ret = validate_xml(filename) assert ret, 'validation failed' f = gdal.VSIFOpenL(filename, 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'Binary file pre-existing PDS4 label' in data, data if expected_standard_id: assert expected_standard_id in data, data gdal.GetDriverByName('PDS4').Delete(filename) assert gdal.VSIStatL(src_ds_name) gdal.GetDriverByName(src_driver_name).Delete(src_ds_name) ############################################################################### # Test CREATE_LABEL_ONLY=YES with ENVI def test_pds4_createlabelonly_envi(): gdal.FileFromMemBuffer('/vsimem/envi_rgbsmall_bip.img', open('data/envi/envi_rgbsmall_bip.img', 'rb').read()) gdal.FileFromMemBuffer('/vsimem/envi_rgbsmall_bip.hdr', open('data/envi/envi_rgbsmall_bip.hdr', 'rb').read()) src_ds = gdal.Open('/vsimem/envi_rgbsmall_bip.img') return _test_createlabelonly(src_ds) ############################################################################### # Test CREATE_LABEL_ONLY=YES with GTiff def test_pds4_createlabelonly_gtiff(): gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/byte.tif', gdal.Open('data/byte.tif')) src_ds = gdal.Open('/vsimem/byte.tif') return _test_createlabelonly(src_ds, expected_standard_id = 'TIFF 6.0', validate = True) ############################################################################### # Test CREATE_LABEL_ONLY=YES with a tiled GTiff (incompatible of raw binary layout) def test_pds4_createlabelonly_gtiff_error(): gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/byte.tif', gdal.Open('data/byte.tif'), options=['TILED=YES']) src_ds = gdal.Open('/vsimem/byte.tif') with gdaltest.error_handler(): assert not gdal.GetDriverByName('PDS4').CreateCopy('/vsimem/out.xml', src_ds, options=['CREATE_LABEL_ONLY=YES']) src_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/byte.tif') ############################################################################### # Test CREATE_LABEL_ONLY=YES with BigTIFF def test_pds4_createlabelonly_bigtiff(): gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/byte.tif', gdal.Open('data/byte.tif'), options=['BIGTIFF=YES']) src_ds = gdal.Open('/vsimem/byte.tif') return _test_createlabelonly(src_ds, expected_standard_id = 'TIFF 6.0') ############################################################################### # Test CREATE_LABEL_ONLY=YES with ISIS3 def test_pds4_createlabelonly_isis3(): gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/input.cub', gdal.Open('../gcore/data/uint16.tif')) src_ds = gdal.Open('/vsimem/input.cub') return _test_createlabelonly(src_ds, expected_standard_id = 'ISIS3') ############################################################################### # Test CREATE_LABEL_ONLY=YES with VICAR def test_pds4_createlabelonly_vicar(): gdal.FileFromMemBuffer('/vsimem/test_vicar_truncated.bin', open('data/vicar/test_vicar_truncated.bin', 'rb').read()) src_ds = gdal.Open('/vsimem/test_vicar_truncated.bin') return _test_createlabelonly(src_ds, expected_standard_id = 'VICAR2') ############################################################################### # Test CREATE_LABEL_ONLY=YES with FITS def test_pds4_createlabelonly_fits(): fits_drv = gdal.GetDriverByName('FITS') if not fits_drv: pytest.skip() fits_drv.CreateCopy('tmp/input.fits', gdal.Open('../gcore/data/int16.tif')) src_ds = gdal.Open('tmp/input.fits') return _test_createlabelonly(src_ds, expected_standard_id = 'FITS 3.0', filename = 'tmp/out.xml') ############################################################################### # Test CREATE_LABEL_ONLY=YES with PDS3 def test_pds4_createlabelonly_pds3(): gdal.FileFromMemBuffer('/vsimem/mc02_truncated.img', open('data/pds/mc02_truncated.img', 'rb').read()) src_ds = gdal.Open('/vsimem/mc02_truncated.img') return _test_createlabelonly(src_ds, expected_standard_id = 'PDS3') gdalautotest-3.2.2/gdrivers/ers.py0000775000175000017500000002426314020414367015677 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ers.py 72ad9af180553ebbf40bf6805ace671b7416e5a8 2020-05-10 16:49:40 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ERS format driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # Copyright (c) 2011-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal from osgeo import osr import gdaltest import pytest ############################################################################### # Perform simple read test. def test_ers_1(): tst = gdaltest.GDALTest('ERS', 'ers/srtm.ers', 1, 64074) tst.testOpen() ds = gdal.Open('data/ers/srtm.ers') md = ds.GetRasterBand(1).GetMetadata() expected_md = {'STATISTICS_MEAN': '-4020.25', 'STATISTICS_MINIMUM': '-4315', 'STATISTICS_MAXIMUM': '-3744', 'STATISTICS_MEDIAN': '-4000'} assert md == expected_md ############################################################################### # Create simple copy and check. def test_ers_2(): tst = gdaltest.GDALTest('ERS', 'ehdr/float32.bil', 1, 27) return tst.testCreateCopy(new_filename='tmp/float32.ers', check_gt=1, vsimem=1) ############################################################################### # Test multi-band file. def test_ers_3(): tst = gdaltest.GDALTest('ERS', 'rgbsmall.tif', 2, 21053) return tst.testCreate(new_filename='tmp/rgbsmall.ers') ############################################################################### # Test HeaderOffset case. def test_ers_4(): gt = (143.59625, 0.025, 0.0, -39.38125, 0.0, -0.025) srs = """GEOGCS["GEOCENTRIC DATUM of AUSTRALIA", DATUM["GDA94", SPHEROID["GRS80",6378137,298.257222101]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""" tst = gdaltest.GDALTest('ERS', 'ers/ers_dem.ers', 1, 56588) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Confirm we can recognised signed 8bit data. def test_ers_5(): ds = gdal.Open('data/ers/8s.ers') md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') assert md['PIXELTYPE'] == 'SIGNEDBYTE', 'Failed to detect SIGNEDBYTE' ds = None ############################################################################### # Confirm a copy preserves the signed byte info. def test_ers_6(): drv = gdal.GetDriverByName('ERS') src_ds = gdal.Open('data/ers/8s.ers') ds = drv.CreateCopy('tmp/8s.ers', src_ds) md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') assert md['PIXELTYPE'] == 'SIGNEDBYTE', 'Failed to detect SIGNEDBYTE' ds = None drv.Delete('tmp/8s.ers') ############################################################################### # Test opening a file with everything in lower case. def test_ers_7(): ds = gdal.Open('data/ers/caseinsensitive.ers') desc = ds.GetRasterBand(1).GetDescription() assert desc == 'RTP 1st Vertical Derivative', 'did not get expected values.' ############################################################################### # Test GCP support def test_ers_8(): src_ds = gdal.Open('../gcore/data/gcps.vrt') drv = gdal.GetDriverByName('ERS') ds = drv.CreateCopy('/vsimem/ers_8.ers', src_ds) ds = None gdal.Unlink('/vsimem/ers_8.ers.aux.xml') ds = gdal.Open('/vsimem/ers_8.ers') expected_gcps = src_ds.GetGCPs() gcps = ds.GetGCPs() gcp_count = ds.GetGCPCount() wkt = ds.GetGCPProjection() ds = None assert wkt == """PROJCS["NUTM11",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],TOWGS84[-3,142,183,0,0,0,0],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""", \ 'did not get expected GCP projection' assert len(gcps) == len(expected_gcps) and len(gcps) == gcp_count, \ 'did not get expected GCP number' for i, gcp in enumerate(gcps): if gcp.GCPPixel != pytest.approx(expected_gcps[i].GCPPixel, abs=1e-6) or \ gcp.GCPLine != pytest.approx(expected_gcps[i].GCPLine, abs=1e-6) or \ gcp.GCPX != pytest.approx(expected_gcps[i].GCPX, abs=1e-6) or \ gcp.GCPY != pytest.approx(expected_gcps[i].GCPY, abs=1e-6): print(gcps[i]) pytest.fail('did not get expected GCP %d' % i) drv.Delete('/vsimem/ers_8.ers') ############################################################################### # Test NoData support (#4207) def test_ers_9(): drv = gdal.GetDriverByName('ERS') ds = drv.Create('/vsimem/ers_9.ers', 1, 1) ds.GetRasterBand(1).SetNoDataValue(123) ds = None f = gdal.VSIFOpenL('/vsimem/ers_9.ers.aux.xml', 'rb') if f is not None: gdal.VSIFCloseL(f) drv.Delete('/vsimem/ers_9.ers') pytest.fail('/vsimem/ers_9.ers.aux.xml should not exist') ds = gdal.Open('/vsimem/ers_9.ers') val = ds.GetRasterBand(1).GetNoDataValue() ds = None drv.Delete('/vsimem/ers_9.ers') assert val == 123, 'did not get expected nodata value' ############################################################################### # Test PROJ, DATUM, UNITS support (#4229) def test_ers_10(): drv = gdal.GetDriverByName('ERS') ds = drv.Create('/vsimem/ers_10.ers', 1, 1, options=['DATUM=GDA94', 'PROJ=MGA55', 'UNITS=METERS']) proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") assert proj == 'MGA55', 'did not get expected PROJ' assert datum == 'GDA94', 'did not get expected DATUM' assert units == 'METERS', 'did not get expected UNITS' # This should be overridden by the above values sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") assert proj == 'MGA55', 'did not get expected PROJ' assert datum == 'GDA94', 'did not get expected DATUM' assert units == 'METERS', 'did not get expected UNITS' ds = None f = gdal.VSIFOpenL('/vsimem/ers_10.ers.aux.xml', 'rb') if f is not None: gdal.VSIFCloseL(f) drv.Delete('/vsimem/ers_10.ers') pytest.fail('/vsimem/ers_10.ers.aux.xml should not exist') ds = gdal.Open('/vsimem/ers_10.ers') wkt = ds.GetProjectionRef() proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") md_ers = ds.GetMetadata("ERS") ds = None drv.Delete('/vsimem/ers_10.ers') assert proj == 'MGA55', 'did not get expected PROJ' assert datum == 'GDA94', 'did not get expected DATUM' assert units == 'METERS', 'did not get expected UNITS' assert md_ers["PROJ"] == proj and md_ers["DATUM"] == datum and md_ers["UNITS"] == units, \ ('GetMetadata() not consistent with ' 'GetMetadataItem()') assert wkt.startswith("""PROJCS["MGA55"""), 'did not get expected projection' ds = drv.Create('/vsimem/ers_10.ers', 1, 1, options=['DATUM=GDA94', 'PROJ=MGA55', 'UNITS=FEET']) ds = None # Check that we can update those values with SetProjection() ds = gdal.Open('/vsimem/ers_10.ers', gdal.GA_Update) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") assert proj == 'GEODETIC', 'did not get expected PROJ' assert datum == 'WGS84', 'did not get expected DATUM' assert units == 'METERS', 'did not get expected UNITS' ds = None ds = gdal.Open('/vsimem/ers_10.ers') proj = ds.GetMetadataItem("PROJ", "ERS") datum = ds.GetMetadataItem("DATUM", "ERS") units = ds.GetMetadataItem("UNITS", "ERS") ds = None drv.Delete('/vsimem/ers_10.ers') assert proj == 'GEODETIC', 'did not get expected PROJ' assert datum == 'WGS84', 'did not get expected DATUM' assert units == 'METERS', 'did not get expected UNITS' ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8744 def test_ers_recursive_opening(): ds = gdal.Open('/vsitar/data/ers/test_ers_recursive.tar/test.ers') ds.GetFileList() ############################################################################### # Cleanup def test_ers_cleanup(): gdaltest.clean_tmp() gdalautotest-3.2.2/gdrivers/rasterlite.py0000775000175000017500000003223414020414367017261 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: rasterlite.py 60446c770a7a8c1567a53b86f4d627047f26c966 2020-05-10 15:57:19 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for Rasterlite driver. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal from osgeo import ogr import gdaltest import pytest ############################################################################### # Get the rasterlite driver def test_rasterlite_1(): gdaltest.rasterlite_drv = gdal.GetDriverByName('RASTERLITE') gdaltest.epsilon_drv = gdal.GetDriverByName('EPSILON') # This is to speed-up the runtime of tests on EXT4 filesystems # Do not use this for production environment if you care about data safety # w.r.t system/OS crashes, unless you know what you are doing. gdal.SetConfigOption('OGR_SQLITE_SYNCHRONOUS', 'OFF') ############################################################################### # Test opening a rasterlite DB without overviews def test_rasterlite_2(): if gdaltest.rasterlite_drv is None: pytest.skip() # Test if SQLite3 supports rtrees try: os.remove('tmp/testrtree.sqlite') except OSError: pass ds2 = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/testrtree.sqlite') gdal.ErrorReset() ds2.ExecuteSQL('CREATE VIRTUAL TABLE testrtree USING rtree(id,minX,maxX,minY,maxY)') ds2.Destroy() try: os.remove('tmp/testrtree.sqlite') except OSError: pass if gdal.GetLastErrorMsg().find('rtree') != -1: gdaltest.rasterlite_drv = None pytest.skip('Please upgrade your sqlite3 library to be able to read Rasterlite DBs (needs rtree support)!') gdal.ErrorReset() ds = gdal.Open('data/rasterlite/rasterlite.sqlite') if ds is None: if gdal.GetLastErrorMsg().find('unsupported file format') != -1: gdaltest.rasterlite_drv = None pytest.skip('Please upgrade your sqlite3 library to be able to read Rasterlite DBs!') pytest.fail() assert ds.RasterCount == 3, 'expected 3 bands' assert ds.GetRasterBand(1).GetOverviewCount() == 0, 'did not expect overview' cs = ds.GetRasterBand(1).Checksum() expected_cs = 11746 assert cs == expected_cs or cs == 11751, \ ('for band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) cs = ds.GetRasterBand(2).Checksum() expected_cs = 19843 assert cs == expected_cs or cs == 20088 or cs == 20083, \ ('for band 2, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) cs = ds.GetRasterBand(3).Checksum() expected_cs = 48911 assert cs == expected_cs or cs == 47978, \ ('for band 3, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) assert ds.GetProjectionRef().find('WGS_1984') != -1, \ ('projection_ref = %s' % ds.GetProjectionRef()) gt = ds.GetGeoTransform() expected_gt = (-180.0, 360. / ds.RasterXSize, 0.0, 90.0, 0.0, -180. / ds.RasterYSize) for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=1e-15) ds = None ############################################################################### # Test opening a rasterlite DB with overviews def test_rasterlite_3(): if gdaltest.rasterlite_drv is None: pytest.skip() ds = gdal.Open('RASTERLITE:data/rasterlite/rasterlite_pyramids.sqlite,table=test') assert ds.RasterCount == 3, 'expected 3 bands' assert ds.GetRasterBand(1).GetOverviewCount() == 1, 'expected 1 overview' cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 59551 assert cs == expected_cs or cs == 59833, \ ('for overview of band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) cs = ds.GetRasterBand(2).GetOverview(0).Checksum() expected_cs = 59603 assert cs == expected_cs or cs == 59588, \ ('for overview of band 2, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) cs = ds.GetRasterBand(3).GetOverview(0).Checksum() expected_cs = 42173 assert cs == expected_cs or cs == 42361, \ ('for overview of band 3, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) ds = None ############################################################################### # Test opening a rasterlite DB with color table and user-defined spatial extent def test_rasterlite_4(): if gdaltest.rasterlite_drv is None: pytest.skip() ds = gdal.Open('RASTERLITE:data/rasterlite/rasterlite_pct.sqlite,minx=0,miny=0,maxx=180,maxy=90') assert ds.RasterCount == 1, 'expected 1 band' assert ds.RasterXSize == 169 and ds.RasterYSize == 85 ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct is not None, 'did not get color table' cs = ds.GetRasterBand(1).Checksum() expected_cs = 36473 assert cs == expected_cs, \ ('for band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) ds = None ############################################################################### # Test opening a rasterlite DB with color table and do color table expansion def test_rasterlite_5(): if gdaltest.rasterlite_drv is None: pytest.skip() ds = gdal.Open('RASTERLITE:data/rasterlite/rasterlite_pct.sqlite,bands=3') assert ds.RasterCount == 3, 'expected 3 bands' ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct is None, 'did not expect color table' cs = ds.GetRasterBand(1).Checksum() expected_cs = 506 assert cs == expected_cs, \ ('for band 1, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) cs = ds.GetRasterBand(2).Checksum() expected_cs = 3842 assert cs == expected_cs, \ ('for band 2, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) cs = ds.GetRasterBand(3).Checksum() expected_cs = 59282 assert cs == expected_cs, \ ('for band 3, cs = %d, different from expected_cs = %d' % (cs, expected_cs)) ds = None ############################################################################### # Test CreateCopy() def test_rasterlite_6(): if gdaltest.rasterlite_drv is None: pytest.skip() # Test first if spatialite is available gdal.PushErrorHandler('CPLQuietErrorHandler') ogr_ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/spatialite_test.db', options=['SPATIALITE=YES']) if ogr_ds is not None: sql_lyr = ogr_ds.ExecuteSQL("SELECT AsText(GeomFromText('POINT(0 1)'))") else: sql_lyr = None gdal.PopErrorHandler() if sql_lyr is None: gdaltest.has_spatialite = False ogr_ds = None pytest.skip() gdaltest.has_spatialite = True ogr_ds.ReleaseResultSet(sql_lyr) ogr_ds.Destroy() # Test now CreateCopy() src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('RASTERLITE').CreateCopy('RASTERLITE:tmp/byte.sqlite,table=byte', src_ds) assert ds is not None assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ 'Wrong checksum' gt = ds.GetGeoTransform() expected_gt = src_ds.GetGeoTransform() for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.GetProjectionRef().find('NAD27 / UTM zone 11N') != -1, 'Wrong SRS' src_ds = None ds = None ############################################################################### # Test BuildOverviews() def test_rasterlite_7(): if gdaltest.rasterlite_drv is None: pytest.skip() if gdaltest.has_spatialite is False: pytest.skip() ds = gdal.Open('tmp/byte.sqlite', gdal.GA_Update) # Resampling method is not taken into account ds.BuildOverviews('NEAREST', overviewlist=[2, 4]) assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 1192, \ 'Wrong checksum for overview 0' assert ds.GetRasterBand(1).GetOverview(1).Checksum() == 233, \ 'Wrong checksum for overview 1' # Reopen and test ds = None ds = gdal.Open('tmp/byte.sqlite') assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 1192, \ 'Wrong checksum for overview 0' assert ds.GetRasterBand(1).GetOverview(1).Checksum() == 233, \ 'Wrong checksum for overview 1' ############################################################################### # Test CleanOverviews() def test_rasterlite_8(): if gdaltest.rasterlite_drv is None: pytest.skip() if gdaltest.has_spatialite is False: pytest.skip() ds = gdal.Open('tmp/byte.sqlite', gdal.GA_Update) ds.BuildOverviews(overviewlist=[]) assert ds.GetRasterBand(1).GetOverviewCount() == 0 ############################################################################### # Create a rasterlite dataset with EPSILON tiles def test_rasterlite_9(): if gdaltest.rasterlite_drv is None: pytest.skip() if gdaltest.has_spatialite is False: pytest.skip() if gdaltest.epsilon_drv is None: pytest.skip() tst = gdaltest.GDALTest('RASTERLITE', 'byte.tif', 1, 4866, options=['DRIVER=EPSILON']) return tst.testCreateCopy(check_gt=1, check_srs=1, check_minmax=0) ############################################################################### # Create a rasterlite dataset with EPSILON tiles def test_rasterlite_10(): if gdaltest.rasterlite_drv is None: pytest.skip() if gdaltest.has_spatialite is False: pytest.skip() if gdaltest.epsilon_drv is None: pytest.skip() tst = gdaltest.GDALTest('RASTERLITE', 'rgbsmall.tif', 1, 23189, options=['DRIVER=EPSILON']) return tst.testCreateCopy(check_gt=1, check_srs=1, check_minmax=0) ############################################################################### # Test BuildOverviews() with AVERAGE resampling def test_rasterlite_11(): if gdaltest.rasterlite_drv is None: pytest.skip() if gdaltest.has_spatialite is False: pytest.skip() ds = gdal.Open('tmp/byte.sqlite', gdal.GA_Update) ds.BuildOverviews(overviewlist=[]) # Resampling method is not taken into account ds.BuildOverviews('AVERAGE', overviewlist=[2, 4]) # Reopen and test ds = None ds = gdal.Open('tmp/byte.sqlite') assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 1152, \ 'Wrong checksum for overview 0' assert ds.GetRasterBand(1).GetOverview(1).Checksum() == 215, \ 'Wrong checksum for overview 1' ############################################################################### # Test opening a .rasterlite file def test_rasterlite_12(): if gdaltest.rasterlite_drv is None: pytest.skip() if gdaltest.has_spatialite is False: pytest.skip() ds = gdal.Open('data/rasterlite/byte.rasterlite') assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' ############################################################################### # Test opening a .rasterlite.sql file def test_rasterlite_13(): if gdaltest.rasterlite_drv is None: pytest.skip() if gdaltest.has_spatialite is False: pytest.skip() if gdaltest.rasterlite_drv.GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") != 'YES': pytest.skip() ds = gdal.Open('data/rasterlite/byte.rasterlite.sql') assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' ############################################################################### # Cleanup def test_rasterlite_cleanup(): if gdaltest.rasterlite_drv is None: pytest.skip() try: os.remove('tmp/spatialite_test.db') except OSError: pass try: os.remove('tmp/byte.sqlite') except OSError: pass try: os.remove('tmp/byte.tif.tst') except OSError: pass try: os.remove('tmp/rgbsmall.tif.tst') except OSError: pass gdalautotest-3.2.2/gdrivers/jdem.py0000775000175000017500000000351414020414367016021 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: jdem.py ed6d6665048ebcfe05997eb0098572c9fb7faf47 2020-05-10 15:47:41 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test JDEM driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test reading a - fake - JDEM dataset def test_jdem_1(): tst = gdaltest.GDALTest('JDEM', 'jdem/fakejdem.mem', 1, 15) return tst.testOpen() gdalautotest-3.2.2/gdrivers/blx.py0000775000175000017500000000673014020414367015672 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: blx.py c99b5848295b1c0db359ef17b907d499b89395f8 2020-05-10 14:49:29 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test BLX support. # Author: Even Rouault < even dot rouault @ spatialys.com > # ############################################################################### # Copyright (c) 2008, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Test reading a little-endian BLX def test_blx_1(): prj = 'WGS84' gt = [20.0004166, 0.0008333, 0.0, 50.0004166, 0.0, -0.0008333] tst = gdaltest.GDALTest('BLX', 'blx/s4103.blx', 1, 47024) return tst.testOpen(check_prj=prj, check_gt=gt) ############################################################################### # Test reading a big-endian BLX def test_blx_2(): prj = 'WGS84' gt = [20.0004166, 0.0008333, 0.0, 50.0004166, 0.0, -0.0008333] tst = gdaltest.GDALTest('BLX', 'blx/s4103.xlb', 1, 47024) return tst.testOpen(check_prj=prj, check_gt=gt) ############################################################################### # Test writing a little-endian BLX def test_blx_3(): tst = gdaltest.GDALTest('BLX', 'blx/s4103.xlb', 1, 47024) return tst.testCreateCopy(check_gt=1, check_srs=1) ############################################################################### # Test writing a big-endian BLX def test_blx_4(): tst = gdaltest.GDALTest('BLX', 'blx/s4103.blx', 1, 47024, options=['BIGENDIAN=YES']) return tst.testCreateCopy(check_gt=1, check_srs=1) ############################################################################### # Test overviews def test_blx_5(): ds = gdal.Open('data/blx/s4103.blx') band = ds.GetRasterBand(1) assert band.GetOverviewCount() == 4, 'did not get expected overview count' cs = band.GetOverview(0).Checksum() assert cs == 42981, ('wrong overview checksum (%d)' % cs) cs = band.GetOverview(1).Checksum() assert cs == 61363, ('wrong overview checksum (%d)' % cs) cs = band.GetOverview(2).Checksum() assert cs == 48060, ('wrong overview checksum (%d)' % cs) cs = band.GetOverview(3).Checksum() assert cs == 12058, ('wrong overview checksum (%d)' % cs) gdalautotest-3.2.2/gdrivers/grass.py0000775000175000017500000000576214020414367016230 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: grass.py a832da5b936bac8438f9c50e7c20e563fd94c9ff 2020-09-22 13:06:27 +0200 Markus Neteler $ # # Project: GDAL/OGR Test Suite # Purpose: GRASS Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Test if GRASS driver is present def test_grass_1(): gdaltest.grass_drv = gdal.GetDriverByName('GRASS') if gdaltest.grass_drv is None: pytest.skip() ############################################################################### # Read existing simple 1 band GRASS dataset. def test_grass_2(): if gdaltest.grass_drv is None: pytest.skip() tst = gdaltest.GDALTest('GRASS', 'small_grass_dataset/demomapset/cellhd/elevation', 1, 41487) srs = """PROJCS["UTM Zone 18, Northern Hemisphere", GEOGCS["grs80", DATUM["North_American_Datum_1983", SPHEROID["Geodetic_Reference_System_1980",6378137,298.257222101], TOWGS84[0.000,0.000,0.000]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-75], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["meter",1]]""" ret = tst.testOpen(check_prj=srs) if ret != 'success': gdaltest.post_reason('If that test fails, checks that the GISBASE environment variable point to the root of your GRASS install. For example GIS_BASE=/usr/lib64/grass78') return ret gdalautotest-3.2.2/gdrivers/jpipkak.py0000775000175000017500000001245614020414367016540 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: jpipkak.py 18659 2010-01-25 03:39:15Z warmerdam $ # # Project: GDAL/OGR Test Suite # Purpose: Test reading with JPIPKAK driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2010, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Read test of simple byte reference data. def test_jpipkak_1(): pytest.skip() # pylint: disable=unreachable gdaltest.jpipkak_drv = gdal.GetDriverByName('JPIPKAK') if gdaltest.jpipkak_drv is None: pytest.skip() ds = gdal.Open('jpip://216.150.195.220/JP2Server/qb_boulder_msi_uint') assert ds is not None, 'failed to open jpip stream.' target = ds.GetRasterBand(3).GetOverview(3) stats = target.GetStatistics(0, 1) assert stats[2] == pytest.approx(6791.121, abs=1.0) and stats[3] == pytest.approx(3046.536, abs=1.0), \ 'did not get expected mean/stddev' ############################################################################### # def test_jpipkak_2(): pytest.skip() # pylint: disable=unreachable if gdaltest.jpipkak_drv is None: pytest.skip() ds = gdal.Open('jpip://216.150.195.220/JP2Server/qb_boulder_pan_byte') assert ds is not None, 'failed to open jpip stream.' wkt = ds.GetProjectionRef() exp_wkt = 'PROJCS["WGS 84 / UTM zone 13N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-105],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32613"]]' assert gdaltest.equal_srs_from_wkt(exp_wkt, wkt) target = ds.GetRasterBand(1).GetOverview(3) stats = target.GetStatistics(0, 1) assert stats[2] == pytest.approx(43.429, abs=1.0) and stats[3] == pytest.approx(18.526, abs=1.0), \ 'did not get expected mean/stddev' ############################################################################### # Test an 11bit image. def test_jpipkak_3(): pytest.skip() # pylint: disable=unreachable if gdaltest.jpipkak_drv is None: pytest.skip() ds = gdal.Open('jpip://216.150.195.220/JP2Server/qb_boulder_pan_11bit') assert ds is not None, 'failed to open jpip stream.' target = ds.GetRasterBand(1) stats = target.GetStatistics(0, 1) assert stats[2] == pytest.approx(483.501, abs=1.0) and stats[3] == pytest.approx(117.972, abs=1.0), \ 'did not get expected mean/stddev' ############################################################################### # Test a 20bit image, reduced to 16bit during processing. def test_jpipkak_4(): pytest.skip() # pylint: disable=unreachable if gdaltest.jpipkak_drv is None: pytest.skip() ds = gdal.Open('jpip://216.150.195.220/JP2Server/qb_boulder_pan_20bit') assert ds is not None, 'failed to open jpip stream.' target = ds.GetRasterBand(1) stats = target.GetStatistics(0, 1) assert stats[2] == pytest.approx(5333.148, abs=1.0) and stats[3] == pytest.approx(2522.023, abs=1.0), \ 'did not get expected mean/stddev' ############################################################################### # Test an overview level that will result in multiple fetches with subwindows. def test_jpipkak_5(): pytest.skip() # pylint: disable=unreachable if gdaltest.jpipkak_drv is None: pytest.skip() ds = gdal.Open('jpip://216.150.195.220/JP2Server/qb_boulder_pan_byte') assert ds is not None, 'failed to open jpip stream.' target = ds.GetRasterBand(1).GetOverview(1) stats = target.GetStatistics(0, 1) assert stats[2] == pytest.approx(42.462, abs=1.0) and stats[3] == pytest.approx(20.611, abs=1.0), \ 'did not get expected mean/stddev' gdalautotest-3.2.2/gdrivers/ingr.py0000775000175000017500000001541414020414367016043 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ingr.py a8c169bc04e64ee9b9c69f467c2cfd37eb8c6e7f 2020-05-10 12:47:55 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for INGR. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest ############################################################################### # Read test of byte file. def test_ingr_1(): tst = gdaltest.GDALTest('INGR', 'ingr/8bit_rgb.cot', 2, 4855) return tst.testOpen() ############################################################################### # Read uint32 file. def test_ingr_2(): tst = gdaltest.GDALTest('INGR', 'ingr/uint32.cot', 1, 4672) return tst.testOpen() ############################################################################### # Test paletted file, including checking the palette (format 02 I think). def test_ingr_3(): tst = gdaltest.GDALTest('INGR', 'ingr/8bit_pal.cot', 1, 4855) tst.testOpen() ds = gdal.Open('data/ingr/8bit_pal.cot') ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct.GetCount() == 256 and ct.GetColorEntry(8) == (8, 8, 8, 255), \ 'Wrong color table entry.' ############################################################################### # frmt02 is a plain byte format def test_ingr_4(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt02.cot', 1, 26968) return tst.testOpen() ############################################################################### # Test creation. def test_ingr_5(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt02.cot', 1, 26968) return tst.testCreate() ############################################################################### # Test createcopy. def test_ingr_6(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt02.cot', 1, 26968) return tst.testCreate() ############################################################################### # JPEG 8bit def test_ingr_7(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt30.cot', 1, 29718) return tst.testOpen() ############################################################################### # Read simple RLE def test_ingr_8(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt09.cot', 1, 23035) return tst.testOpen() ############################################################################### # Read Simple RLE Variable def test_ingr_9(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt10.cot', 1, 47031) return tst.testOpen() ############################################################################### # CCITT bitonal def test_ingr_10(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt24.cit', 1, 23035) return tst.testOpen() ############################################################################### # Adaptive RLE - 24 bit. def test_ingr_11(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt27.cot', 2, 45616) return tst.testOpen() ############################################################################### # Uncompressed RGB def test_ingr_12(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt28.cot', 2, 45616) return tst.testOpen() ############################################################################### # Adaptive RLE 8bit. def test_ingr_13(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt29.cot', 1, 26968) return tst.testOpen() ############################################################################### # JPEG RGB def test_ingr_14(): ds = gdal.Open('data/ingr/frmt31.cot') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 11466 or cs == 11095 ############################################################################### # Same, but through vsimem all in memory. def test_ingr_15(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt02.cot', 1, 26968) result = tst.testCreateCopy(vsimem=1) try: os.remove('data/ingr/frmt02.cot.aux.xml') except OSError: pass return result ############################################################################### # Read simple RLE tiled def test_ingr_16(): tst = gdaltest.GDALTest('INGR', 'ingr/frmt09t.cot', 1, 3178) return tst.testOpen() ############################################################################### # Test writing 9 RLE bitonal compression (#5030) def test_ingr_17(): src_ds = gdal.Open('data/ingr/frmt09.cot') out_ds = gdal.GetDriverByName('INGR').CreateCopy('/vsimem/ingr_17.rle', src_ds) del out_ds ref_cs = src_ds.GetRasterBand(1).Checksum() src_ds = None ds = gdal.Open('/vsimem/ingr_17.rle') got_cs = ds.GetRasterBand(1).Checksum() ds = None gdal.GetDriverByName('INGR').Delete('/vsimem/ingr_17.rle') assert got_cs == ref_cs ############################################################################### # Test 'random access' in simple RLE def test_ingr_18(): ds = gdal.Open('data/ingr/frmt09.cot') for y in range(ds.RasterYSize): expected_data = ds.ReadRaster(0, y, ds.RasterXSize, 1) ds = None ds = gdal.Open('data/ingr/frmt09.cot') ds.ReadRaster(0, 5, ds.RasterXSize, 1) got_data = ds.ReadRaster(0, ds.RasterYSize - 1, ds.RasterXSize, 1) assert got_data == expected_data ds.FlushCache() got_data = ds.ReadRaster(0, ds.RasterYSize - 1, ds.RasterXSize, 1) assert got_data == expected_data def test_ingr_cleanup(): gdal.Unlink('data/ingr/frmt09.cot.aux.xml') gdalautotest-3.2.2/gdrivers/vrtpansharpen.py0000775000175000017500000023372414020414367020005 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: vrtpansharpen.py 6fea8863f7c33ef02b5098ee82ee80ecf250fac9 2020-11-17 21:14:43 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test VRTPansharpenedDataset support. # Author: Even Rouault # ############################################################################### # Copyright (c) 2015, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import shutil from osgeo import gdal import pytest ############################################################################### # Error cases def test_vrtpansharpen_1(): src_ds = gdal.Open('data/small_world.tif') src_data = src_ds.GetRasterBand(1).ReadRaster() gt = src_ds.GetGeoTransform() wkt = src_ds.GetProjectionRef() src_ds = None pan_ds = gdal.GetDriverByName('GTiff').Create('tmp/small_world_pan.tif', 800, 400) gt = [gt[i] for i in range(len(gt))] gt[1] *= 0.5 gt[5] *= 0.5 pan_ds.SetGeoTransform(gt) pan_ds.SetProjection(wkt) pan_ds.GetRasterBand(1).WriteRaster(0, 0, 800, 400, src_data, 400, 200) pan_ds = None # Missing PansharpeningOptions gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue """) gdal.PopErrorHandler() assert vrt_ds is None # PanchroBand missing gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # PanchroBand.SourceFilename missing gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # Invalid dataset name gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 /does/not/exist 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # Inconsistent declared VRT dimensions with panchro dataset. gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # VRTRasterBand of unrecognized subclass 'blabla' gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # Algorithm unsupported_alg unsupported gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue unsupported_alg 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # 10 invalid band of tmp/small_world_pan.tif gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 10 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # SpectralBand.dstBand = '-1' invalid gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # SpectralBand.SourceFilename missing gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # Invalid dataset name gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 /does/not/exist 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # 10 invalid band of data/small_world.tif gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 10 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # Another spectral band is already mapped to output band 1 gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # No spectral band defined gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 """) gdal.PopErrorHandler() assert vrt_ds is None # Hole in SpectralBand.dstBand numbering gdal.PushErrorHandler() vrt_ds = gdal.Open(""" WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # Band 4 of type VRTPansharpenedRasterBand, but no corresponding SpectralBand gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # SpectralBand.dstBand = '3' invalid gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # 2 weights defined, but 3 input spectral bands gdal.PushErrorHandler() vrt_ds = gdal.Open(""" Red Green Blue WeightedBrovey 0.33333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is None # Dimensions of input spectral band 1 different from first spectral band gdal.PushErrorHandler() vrt_ds = gdal.Open(""" tmp/small_world_pan.tif 1 data/small_world.tif 1 tmp/small_world_pan.tif 1 """) gdal.PopErrorHandler() assert vrt_ds is None # Just warnings # Warning 1: Pan dataset and data/byte.tif do not seem to have same projection. Results might be incorrect # Georeferencing of top-left corner of pan dataset and data/byte.tif do not match # Georeferencing of bottom-right corner of pan dataset and data/byte.tif do not match gdal.ErrorReset() gdal.PushErrorHandler() vrt_ds = gdal.Open(""" None tmp/small_world_pan.tif 1 data/byte.tif 1 """) gdal.PopErrorHandler() assert vrt_ds is not None assert gdal.GetLastErrorMsg() != '' # Just warnings # No spectral band is mapped to an output band # No output pansharpened band defined gdal.ErrorReset() gdal.PushErrorHandler() vrt_ds = gdal.Open(""" WeightedBrovey 0.33333,0.333333,0.333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) gdal.PopErrorHandler() assert vrt_ds is not None assert gdal.GetLastErrorMsg() != '' # Unsupported gdal.PushErrorHandler() ret = vrt_ds.AddBand(gdal.GDT_Byte) gdal.PopErrorHandler() assert ret != 0 ############################################################################### # Nominal cases def test_vrtpansharpen_2(): shutil.copy('data/small_world.tif', 'tmp/small_world.tif') # Super verbose case vrt_ds = gdal.Open(""" GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 Red Green Blue WeightedBrovey 0.33333333333333333,0.33333333333333333,0.33333333333333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) assert vrt_ds is not None assert vrt_ds.GetFileList() == ['tmp/small_world_pan.tif', 'data/small_world.tif'] assert vrt_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 0 assert vrt_ds.GetRasterBand(1).GetOverview(-1) is None assert vrt_ds.GetRasterBand(1).GetOverview(0) is None # Check VRTPansharpenedDataset::IRasterIO() in non-resampling case data = vrt_ds.ReadRaster() tmp_ds = gdal.GetDriverByName('MEM').Create('', 800, 400, 3) tmp_ds.WriteRaster(0, 0, 800, 400, data) cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(tmp_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) # Check VRTPansharpenedDataset::IRasterIO() in resampling case data = vrt_ds.ReadRaster(0, 0, 800, 400, 400, 200) ref_data = tmp_ds.ReadRaster(0, 0, 800, 400, 400, 200) assert data == ref_data # Compact case vrt_ds = gdal.Open(""" tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([4735, 10000, 9742], [4731, 9991, 9734]) # Expose pan band too vrt_ds = gdal.Open(""" GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 tmp/small_world_pan.tif 1 Red Green Blue WeightedBrovey 0.33333333333333333,0.33333333333333333,0.33333333333333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) assert vrt_ds is not None # gdal.GetDriverByName('GTiff').CreateCopy('out1.tif', vrt_ds) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([50261, 4735, 10000, 9742], [50261, 4731, 9991, 9734]) # Same, but everything scrambled, and with spectral bands not in # the same dataset vrt_ds = gdal.Open(""" GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 tmp/small_world_pan.tif 1 Red Green Blue WeightedBrovey 0.33333333333333333,0.33333333333333333,0.33333333333333333 Cubic ALL_CPUS 8 tmp/small_world_pan.tif 1 data/small_world.tif 2 data/small_world.tif 1 tmp/small_world.tif 3 """) assert vrt_ds is not None # gdal.GetDriverByName('GTiff').CreateCopy('out2.tif', vrt_ds) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([50261, 4735, 10000, 9742], [50261, 4727, 9998, 9732]) ############################################################################### # Test with overviews def test_vrtpansharpen_3(): ds = gdal.Open('tmp/small_world_pan.tif') ds.BuildOverviews('CUBIC', [2]) ds = None xml = """ tmp/small_world_pan.tif 1 tmp/small_world.tif 1 tmp/small_world.tif 2 tmp/small_world.tif 3 """ # Test when only Pan band has overviews vrt_ds = gdal.Open(xml) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 1 assert vrt_ds.GetRasterBand(1).GetOverview(0) is not None cs = [vrt_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([7123, 7445, 5025], [7120, 7440, 5025]) # Check VRTPansharpenedDataset::IRasterIO() in resampling case with overviews data = vrt_ds.ReadRaster(0, 0, 800, 400, 400, 200) data2 = vrt_ds.GetRasterBand(1).ReadRaster(0, 0, 800, 400, 400, 200) data2 += vrt_ds.GetRasterBand(2).ReadRaster(0, 0, 800, 400, 400, 200) data2 += vrt_ds.GetRasterBand(3).ReadRaster(0, 0, 800, 400, 400, 200) assert data == data2 tmp_ds = gdal.GetDriverByName('MEM').Create('', 400, 200, 3) tmp_ds.WriteRaster(0, 0, 400, 200, data) cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(tmp_ds.RasterCount)] assert cs in ([7123, 7445, 5025], [7120, 7440, 5025]) vrt_ds = None ds = gdal.Open('tmp/small_world.tif') ds.BuildOverviews('CUBIC', [2]) ds = None # Test when both Pan and spectral bands have overviews vrt_ds = gdal.Open(xml) assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 1 assert vrt_ds.GetRasterBand(1).GetOverview(0) is not None cs = [vrt_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in ([18033, 18395, 16824], [18033, 18395, 16822]) vrt_ds = None ############################################################################### # Test RasterIO() with various buffer datatypes def test_vrtpansharpen_4(): xml = """ tmp/small_world_pan.tif 1 tmp/small_world.tif 1 tmp/small_world.tif 2 tmp/small_world.tif 3 """ vrt_ds = gdal.Open(xml) for dt in [gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CFloat64]: data = vrt_ds.GetRasterBand(1).ReadRaster(buf_type=dt) tmp_ds = gdal.GetDriverByName('MEM').Create('', 800, 400, 1, dt) tmp_ds.WriteRaster(0, 0, 800, 400, data) cs = tmp_ds.GetRasterBand(1).Checksum() if dt == gdal.GDT_CFloat64: expected_cs = [4724, 4720] else: expected_cs = [4735, 4731] assert cs in expected_cs, gdal.GetDataTypeName(dt) ############################################################################### # Test RasterIO() with various band datatypes def test_vrtpansharpen_5(): for dt in [gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CFloat64]: spectral_xml = """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 9.0000000000000002e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -9.0000000000000002e-01 Red data/small_world.tif 1 Green data/small_world.tif 2 Blue data/small_world.tif 3 """ % (gdal.GetDataTypeName(dt), gdal.GetDataTypeName(dt), gdal.GetDataTypeName(dt)) xml = """ GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]] -1.8000000000000000e+02, 4.5000000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -4.5000000000000001e-01 tmp/small_world_pan.tif 1 ]]> 1 1 2 3 """ % (gdal.GetDataTypeName(dt), spectral_xml, spectral_xml, spectral_xml) vrt_ds = gdal.Open(xml) data = vrt_ds.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_Byte) tmp_ds = gdal.GetDriverByName('MEM').Create('', 800, 400, 1) tmp_ds.WriteRaster(0, 0, 800, 400, data) cs = tmp_ds.GetRasterBand(1).Checksum() if dt == gdal.GDT_UInt16: assert cs in (4553, 4549), gdal.GetDataTypeName(dt) else: assert cs == 4450, gdal.GetDataTypeName(dt) ############################################################################### # Test BitDepth limitations def test_vrtpansharpen_6(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy except (ImportError, AttributeError): pytest.skip() # i = 0: VRT has 7 # i = 1: bands have NBITS=7 and VRT 7 # i = 2: bands have NBITS=7 for dt in [gdal.GDT_Byte, gdal.GDT_UInt16]: if dt == gdal.GDT_Byte: nbits = 7 elif dt == gdal.GDT_UInt16: nbits = 12 else: nbits = 17 for i in range(3): if i > 0: options = ['NBITS=%d' % nbits] else: options = [] mem_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ms.tif', 4, 1, 1, dt, options=options) ar = numpy.array([[80, 125, 125, 80]]) if dt == gdal.GDT_UInt16: ar = ar << (12 - 7) elif dt == gdal.GDT_UInt32: ar = ar << (17 - 7) mem_ds.GetRasterBand(1).WriteArray(ar) mem_ds = None mem_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pan.tif', 8, 2, 1, dt, options=options) ar = numpy.array([[76, 89, 115, 127, 127, 115, 89, 76], [76, 89, 115, 127, 127, 115, 89, 76]]) if dt == gdal.GDT_UInt16: ar = ar << (12 - 7) elif dt == gdal.GDT_UInt32: ar = ar << (17 - 7) mem_ds.GetRasterBand(1).WriteArray(ar) mem_ds = None xml = """ """ if i < 2: xml += """ %d""" % nbits xml += """ 0.8 /vsimem/pan.tif 1 /vsimem/ms.tif 1 """ vrt_ds = gdal.Open(xml) assert vrt_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == str(nbits) ar = vrt_ds.GetRasterBand(1).ReadAsArray() if dt == gdal.GDT_Byte: expected_ar = [95, 111, 127, 127, 127, 127, 111, 95] elif dt == gdal.GDT_UInt16: expected_ar = [3040, 3560, 4095, 4095, 4095, 4095, 3560, 3040] else: expected_ar = [97280, 113920, 131071, 131071, 131071, 131071, 113920, 97280] if list(ar[0]) != expected_ar: print(gdal.GetDataTypeName(dt)) pytest.fail(i) vrt_ds = None gdal.Unlink('/vsimem/ms.tif') gdal.Unlink('/vsimem/pan.tif') ############################################################################### # Test bands with different extents def test_vrtpansharpen_7(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtpansharpen_7_pan.tif', 20, 40) ds.SetGeoTransform([120, 1, 0, 80, 0, -1]) ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtpansharpen_7_ms.tif', 15, 30) ds.SetGeoTransform([100, 2, 0, 100, 0, -2]) ds = None xml = """ /vsimem/vrtpansharpen_7_pan.tif /vsimem/vrtpansharpen_7_ms.tif """ ds = gdal.Open(xml) assert ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and ds.RasterXSize == 40 and ds.RasterYSize == 60 ds = None xml = """ Union /vsimem/vrtpansharpen_7_pan.tif /vsimem/vrtpansharpen_7_ms.tif """ ds = gdal.Open(xml) assert ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and ds.RasterXSize == 40 and ds.RasterYSize == 60 ds = None xml = """ BlaBla /vsimem/vrtpansharpen_7_pan.tif /vsimem/vrtpansharpen_7_ms.tif """ gdal.ErrorReset() gdal.PushErrorHandler() ds = gdal.Open(xml) gdal.PopErrorHandler() assert ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and ds.RasterXSize == 40 and ds.RasterYSize == 60 assert gdal.GetLastErrorMsg() == '' ds = None xml = """ Intersection /vsimem/vrtpansharpen_7_pan.tif /vsimem/vrtpansharpen_7_ms.tif """ ds = gdal.Open(xml) assert ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) and ds.RasterXSize == 10 and ds.RasterYSize == 40 ds = None xml = """ None /vsimem/vrtpansharpen_7_pan.tif /vsimem/vrtpansharpen_7_ms.tif """ gdal.ErrorReset() gdal.PushErrorHandler() ds = gdal.Open(xml) gdal.PopErrorHandler() assert ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) and ds.RasterXSize == 20 and ds.RasterYSize == 40 assert gdal.GetLastErrorMsg() != '' ds = None xml = """ NoneWithoutWarning /vsimem/vrtpansharpen_7_pan.tif /vsimem/vrtpansharpen_7_ms.tif """ gdal.ErrorReset() ds = gdal.Open(xml) assert ds.GetGeoTransform() == (120.0, 1.0, 0.0, 80.0, 0.0, -1.0) and ds.RasterXSize == 20 and ds.RasterYSize == 40 assert gdal.GetLastErrorMsg() == '' ds = None # Empty intersection ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtpansharpen_7_ms.tif', 15, 30) ds.SetGeoTransform([-100, 2, 0, -100, 0, -2]) ds = None xml = """ Intersection /vsimem/vrtpansharpen_7_pan.tif /vsimem/vrtpansharpen_7_ms.tif """ gdal.PushErrorHandler() ds = gdal.Open(xml) gdal.PopErrorHandler() assert ds is None ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/vrtpansharpen_7_pan.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/vrtpansharpen_7_ms.tif') ############################################################################### # Test SerializeToXML() def test_vrtpansharpen_8(): xml = """ 123 small_world_pan.tif data/small_world.tif data/small_world.tif 2 """ open('tmp/vrtpansharpen_8.vrt', 'wt').write(xml) ds = gdal.Open('tmp/vrtpansharpen_8.vrt', gdal.GA_Update) expected_cs1 = ds.GetRasterBand(1).Checksum() expected_cs2 = ds.GetRasterBand(2).Checksum() expected_cs3 = ds.GetRasterBand(3).Checksum() # Force update ds.SetMetadata(ds.GetMetadata()) ds = None ds = gdal.Open('tmp/vrtpansharpen_8.vrt') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() ds = None gdal.Unlink('tmp/vrtpansharpen_8.vrt') assert cs1 == expected_cs1 and cs2 == expected_cs2 and cs3 == expected_cs3 ############################################################################### # Test NoData support def test_vrtpansharpen_9(): # Explicit nodata vrt_ds = gdal.Open(""" 0 tmp/small_world_pan.tif 1 data/small_world.tif 1 data/small_world.tif 2 data/small_world.tif 3 """) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] expected_cs_list = ([6950, 11745, 8965], [6946, 11736, 8957] # s390x ) assert cs in expected_cs_list # Implicit nodata ds = gdal.GetDriverByName('GTiff').Create('/vsimem/small_world_pan_nodata.tif', 800, 400) ds.GetRasterBand(1).SetNoDataValue(0) ds.WriteRaster(0, 0, 800, 400, gdal.Open('tmp/small_world_pan.tif').ReadRaster()) ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/small_world_nodata.tif', 400, 200, 3) ds.GetRasterBand(1).SetNoDataValue(0) ds.GetRasterBand(2).SetNoDataValue(0) ds.GetRasterBand(3).SetNoDataValue(0) ds.WriteRaster(0, 0, 400, 200, gdal.Open('data/small_world.tif').ReadRaster()) ds = None vrt_ds = gdal.Open(""" /vsimem/small_world_pan_nodata.tif 1 /vsimem/small_world_nodata.tif 1 /vsimem/small_world_nodata.tif 2 /vsimem/small_world_nodata.tif 3 """) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in expected_cs_list gdal.Unlink('/vsimem/small_world_pan_nodata.tif') gdal.Unlink('/vsimem/small_world_nodata.tif') ############################################################################### # Test UInt16 optimizations def test_vrtpansharpen_10(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pan.tif', 1023, 1023, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).Fill(1000) ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ms.tif', 256, 256, 4, gdal.GDT_UInt16) for i in range(4): ds.GetRasterBand(i + 1).Fill(1000) ds = None # 4 bands vrt_ds = gdal.Open(""" ALL_CPUS /vsimem/pan.tif 1 /vsimem/ms.tif 1 /vsimem/ms.tif 2 /vsimem/ms.tif 3 /vsimem/ms.tif 4 """) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs == [62009, 62009, 62009, 62009] # Actually go through the optimized impl data = vrt_ds.ReadRaster() # And check data_int32 = vrt_ds.ReadRaster(buf_type=gdal.GDT_Int32) tmp_ds = gdal.GetDriverByName('MEM').Create('', vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32) tmp_ds.WriteRaster(0, 0, vrt_ds.RasterXSize, vrt_ds.RasterYSize, data_int32) ref_data = tmp_ds.ReadRaster(buf_type=gdal.GDT_UInt16) assert data == ref_data # 4 bands -> 3 bands vrt_ds = gdal.Open(""" ALL_CPUS /vsimem/pan.tif 1 /vsimem/ms.tif 1 /vsimem/ms.tif 2 /vsimem/ms.tif 3 /vsimem/ms.tif 4 """) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs == [62009, 62009, 62009] # Actually go through the optimized impl data = vrt_ds.ReadRaster() # And check data_int32 = vrt_ds.ReadRaster(buf_type=gdal.GDT_Int32) tmp_ds = gdal.GetDriverByName('MEM').Create('', vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32) tmp_ds.WriteRaster(0, 0, vrt_ds.RasterXSize, vrt_ds.RasterYSize, data_int32) ref_data = tmp_ds.ReadRaster(buf_type=gdal.GDT_UInt16) assert data == ref_data # 3 bands vrt_ds = gdal.Open(""" ALL_CPUS /vsimem/pan.tif 1 /vsimem/ms.tif 1 /vsimem/ms.tif 2 /vsimem/ms.tif 3 """) cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs == [62009, 62009, 62009] # Actually go through the optimized impl data = vrt_ds.ReadRaster() # And check data_int32 = vrt_ds.ReadRaster(buf_type=gdal.GDT_Int32) tmp_ds = gdal.GetDriverByName('MEM').Create('', vrt_ds.RasterXSize, vrt_ds.RasterYSize, vrt_ds.RasterCount, gdal.GDT_Int32) tmp_ds.WriteRaster(0, 0, vrt_ds.RasterXSize, vrt_ds.RasterYSize, data_int32) ref_data = tmp_ds.ReadRaster(buf_type=gdal.GDT_UInt16) assert data == ref_data ############################################################################### # Test gdal.CreatePansharpenedVRT() def test_vrtpansharpen_11(): pan_ds = gdal.Open('tmp/small_world_pan.tif') ms_ds = gdal.Open('data/small_world.tif') vrt_ds = gdal.CreatePansharpenedVRT(""" """, pan_ds.GetRasterBand(1), [ms_ds.GetRasterBand(i + 1) for i in range(3)]) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in([4735, 10000, 9742], [4731, 9991, 9734]) # Also test with completely anonymous datasets pan_mem_ds = gdal.GetDriverByName('MEM').CreateCopy('', pan_ds) ms_mem_ds = gdal.GetDriverByName('MEM').CreateCopy('', ms_ds) pan_ds = None ms_ds = None vrt_ds = gdal.CreatePansharpenedVRT(""" """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs in([4735, 10000, 9742], [4731, 9991, 9734]) vrt_ds = None # Check that wrapping with VRT works (when gt are not compatible) pan_mem_ds = gdal.GetDriverByName('MEM').Create('', 20, 40, 1) ms_mem_ds = gdal.GetDriverByName('MEM').Create('', 15, 30, 3) pan_mem_ds.SetGeoTransform([120, 1, 0, 80, 0, -1]) ms_mem_ds.SetGeoTransform([100, 2, 0, 100, 0, -2]) vrt_ds = gdal.CreatePansharpenedVRT(""" """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) assert vrt_ds.GetGeoTransform() == (100.0, 1.0, 0.0, 100.0, 0.0, -1.0) and vrt_ds.RasterXSize == 40 and vrt_ds.RasterYSize == 60 vrt_ds = None # Test error cases as well gdal.PushErrorHandler() vrt_ds = gdal.CreatePansharpenedVRT(""" """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) gdal.PopErrorHandler() assert vrt_ds is None # Too many bands gdal.PushErrorHandler() vrt_ds = gdal.CreatePansharpenedVRT(""" """, pan_mem_ds.GetRasterBand(1), [ms_mem_ds.GetRasterBand(i + 1) for i in range(3)]) gdal.PopErrorHandler() assert vrt_ds is None ############################################################################### # Test fix for https://github.com/OSGeo/gdal/issues/2328 def test_vrtpansharpen_nodata_multiple_spectral_bands(): gdal.Translate('/vsimem/b1.tif', 'data/small_world.tif') gdal.Translate('/vsimem/b2.tif', 'data/small_world.tif') vrt_ds = gdal.Open(""" 0 data/small_world.tif 1 /vsimem/b1.tif 1 /vsimem/b2.tif 1 """) assert vrt_ds gdal.Unlink('/vsimem/b1.tif') gdal.Unlink('/vsimem/b2.tif') ############################################################################### # Test fix for https://github.com/OSGeo/gdal/issues/3189 # that is when the spectral bands have no nodata value, but we have one # declared in PansharpeningOptions, and when the VRTPansharpenedDataset # exposes overviews def test_vrtpansharpen_nodata_overviews(): ds = gdal.Translate('/vsimem/pan.tif', 'data/byte.tif') ds.BuildOverviews('NEAR', [2]) ds = None ds = gdal.Translate('/vsimem/ms.tif', 'data/byte.tif') ds.BuildOverviews('NEAR', [2]) ds = None vrt_ds = gdal.Open(""" 0 /vsimem/pan.tif 1 /vsimem/ms.tif 1 """) assert vrt_ds assert vrt_ds.GetRasterBand(1).GetOverviewCount() == 1 vrt_ds = None gdal.Unlink('/vsimem/pan.tif') gdal.Unlink('/vsimem/ms.tif') ############################################################################### # Test input multispectral bands not in order 1,2,... and NoData as PansharpeningOptions def test_vrtpansharpen_out_of_order_input_bands_and_nodata(): src_ds = gdal.Open('data/small_world.tif') src_data = src_ds.GetRasterBand(1).ReadRaster() gt = src_ds.GetGeoTransform() wkt = src_ds.GetProjectionRef() src_ds = None pan_ds = gdal.GetDriverByName('MEM').Create('', 800, 400) gt = [gt[i] for i in range(len(gt))] gt[1] *= 0.5 gt[5] *= 0.5 pan_ds.SetGeoTransform(gt) pan_ds.SetProjection(wkt) pan_ds.GetRasterBand(1).WriteRaster(0, 0, 800, 400, src_data, 400, 200) ms_ds = gdal.Open('data/small_world.tif') vrt_ds = gdal.CreatePansharpenedVRT(""" 0.5,0.5 0 """, pan_ds.GetRasterBand(1), [ms_ds.GetRasterBand(i + 1) for i in range(2)]) assert vrt_ds is not None cs = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] # Switches the input multispectral bands vrt_ds = gdal.CreatePansharpenedVRT(""" 0.5,0.5 0 """, pan_ds.GetRasterBand(1), [ms_ds.GetRasterBand(2 - i) for i in range(2)]) assert vrt_ds is not None cs2 = [vrt_ds.GetRasterBand(i + 1).Checksum() for i in range(vrt_ds.RasterCount)] assert cs2 == cs[::-1] ############################################################################### # Cleanup def test_vrtpansharpen_cleanup(): gdal.GetDriverByName('GTiff').Delete('tmp/small_world_pan.tif') gdal.GetDriverByName('GTiff').Delete('tmp/small_world.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/pan.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/ms.tif') gdalautotest-3.2.2/gdrivers/fast.py0000775000175000017500000002135114020414370016030 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: fast.py e4c942634f042a94dc6349c83f681063999c6396 2020-05-10 12:45:21 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test EOSAT FAST Format support. # Author: Mateusz Loskot # ############################################################################### # Copyright (c) 2007, Mateusz Loskot # Copyright (c) 2008-2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Verify we have the driver. def test_fast_1(): gdaltest.fast_drv = gdal.GetDriverByName('FAST') if gdaltest.fast_drv is None: pytest.skip() ############################################################################### # Perform simple read test. def test_fast_2(): if gdaltest.fast_drv is None: pytest.skip() # Actually, the band (a placeholder) is of 0 bytes size, # so the checksum is 0 expected. tst = gdaltest.GDALTest('fast', 'fast/L71118038_03820020111_HPN.FST', 1, 60323, 0, 0, 5000, 1) return tst.testOpen() ############################################################################### # Verify metadata. def test_fast_3(): if gdaltest.fast_drv is None: pytest.skip() gdaltest.fast_ds = gdal.Open('data/fast/L71118038_03820020111_HPN.FST') ds = gdaltest.fast_ds assert ds is not None, 'Missing test dataset' md = ds.GetMetadata() assert md is not None, 'Missing metadata in test dataset' assert md['ACQUISITION_DATE'] == '20020111', 'ACQUISITION_DATE wrong' assert md['SATELLITE'] == 'LANDSAT7', 'SATELLITE wrong' assert md['SENSOR'] == 'ETM+', 'SENSOR wrong' # GAIN and BIAS expected values gb_expected = (-6.199999809265137, 0.775686297697179) gain = float(md['GAIN1']) if gain != pytest.approx(gb_expected[0], abs=0.0001): print('expected:', gb_expected[0]) print('got:', gain) bias = float(md['BIAS1']) if bias != pytest.approx(gb_expected[1], abs=0.0001): print('expected:', gb_expected[1]) print('got:', bias) ############################################################################### # Test geotransform data. def test_fast_4(): if gdaltest.fast_drv is None: pytest.skip() ds = gdaltest.fast_ds assert ds is not None, 'Missing test dataset' gt = ds.GetGeoTransform() gdaltest.fast_ds = None ds = None tolerance = 0.01 assert (gt[0] == pytest.approx(280342.5, abs=tolerance) and gt[1] == pytest.approx(15.0, abs=tolerance) and \ gt[2] == pytest.approx(0.0, abs=tolerance) and gt[3] == pytest.approx(3621457.5, abs=tolerance) and \ gt[4] == pytest.approx(0.0, abs=tolerance) and abs(gt[5] + 15.0) <= tolerance), \ 'FAST geotransform wrong' ############################################################################### # Test 2 bands dataset with checking projections and geotransform. def test_fast_5(): if gdaltest.fast_drv is None: pytest.skip() tst = gdaltest.GDALTest('fast', 'fast/L71230079_07920021111_HTM.FST', 2, 19110, 0, 0, 7000, 1) # Expected parameters of the geotransform gt = (528417.25, 30.0, 0.0, 7071187.0, 0.0, -30.0) # Expected definition of the projection proj = """PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AXIS["Lat",NORTH], AXIS["Long",EAST], AUTHORITY["EPSG","4326"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-66], PARAMETER["scale_factor",1], PARAMETER["false_easting",500000], PARAMETER["false_northing",10002288.3], UNIT["Meter",1]]""" return tst.testOpen(check_gt=gt, check_prj=proj) ############################################################################### # Test Euromap LISS3 dataset def test_fast_6(): if gdaltest.fast_drv is None: pytest.skip() tst = gdaltest.GDALTest('fast', 'fast/n0o0y867.0fl', 1, 0, 0, 0, 2741, 1) # Expected parameters of the geotransform gt = (14640936.89174916, 1.008817518246492, 24.9876841746236, 664274.3912497687, 24.98828832116786, -0.9907878581173808) # Expected definition of the projection proj = """LOCAL_CS["GCTP projection number 22", UNIT["Meter",1]]""" return tst.testOpen(check_gt=gt, check_prj=proj) ############################################################################### # Test Euromap PAN dataset def test_fast_7(): if gdaltest.fast_drv is None: pytest.skip() tst = gdaltest.GDALTest('fast', 'fast/h0o0y867.1ah', 1, 0, 0, 0, 5815, 1) # Expected parameters of the geotransform gt = (676565.09, 5, 0, 5348341.5, 0, -5) # Expected definition of the projection proj = """PROJCS["UTM Zone 32, Northern Hemisphere", GEOGCS["Unknown datum based upon the WGS 84 ellipsoid", DATUM["Not specified (based on WGS 84 spheroid)", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",9], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["Meter",1]]""" return tst.testOpen(check_gt=gt, check_prj=proj) ############################################################################### # Test Euromap WIFS dataset def test_fast_8(): if gdaltest.fast_drv is None: pytest.skip() tst = gdaltest.GDALTest('fast', 'fast/w0y13a4t.010', 1, 0, 0, 0, 4748, 1) # Expected parameters of the geotransform gt = (-336965.0150603952, 176.0817495260164, -37.35662873563219, 484122.7765089957, -37.35622603749736, -176.081791954023) # Expected definition of the projection proj = """PROJCS["unnamed", GEOGCS["Unknown datum based upon the International 1924 ellipsoid", DATUM["Not specified (based on International 1924 spheroid)", SPHEROID["International 1924",6378388,297, AUTHORITY["EPSG","7022"]]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",44.14623833735833], PARAMETER["standard_parallel_2",41.36002161426806], PARAMETER["latitude_of_origin",42.71125349618411], PARAMETER["central_meridian",16.31349670734809], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["Meter",1]]""" return tst.testOpen(check_gt=gt, check_prj=proj) ############################################################################### # Check some metadata and opening for a RevB L7 file (#3306, #3307). def test_fast_9(): if gdaltest.fast_drv is None: pytest.skip() ds = gdal.Open('data/fast/HEADER.DAT') assert ds.GetMetadataItem('SENSOR') == '', 'Did not get expected SENSOR value.' assert ds.RasterCount == 7, 'Did not get expected band count.' ############################################################################### # gdalautotest-3.2.2/gdrivers/gmt.py0000775000175000017500000000470414020414370015665 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: gmt.py b57a9c7a276ebf945332983d94a283666a4867d8 2020-05-10 17:52:33 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GMT driver support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Perform simple read test. def test_gmt_1(): gdaltest.gmt_drv = gdal.GetDriverByName('GMT') if gdaltest.gmt_drv is None: pytest.skip() tst = gdaltest.GDALTest('GMT', 'gmt/gmt_1.grd', 1, 34762) gt = (59.958333333333336, 0.083333333333333, 0.0, 25.041666666666668, 0.0, -0.083333333333333) return tst.testOpen(check_gt=gt) ############################################################################### # Verify a simple createcopy operation with 16bit data. def test_gmt_2(): if gdaltest.gmt_drv is None: pytest.skip() tst = gdaltest.GDALTest('GMT', 'int16.tif', 1, 4672) return tst.testCreateCopy(check_gt=1) ############################################################################### gdalautotest-3.2.2/gdrivers/mem.py0000775000175000017500000005247414020414370015663 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: mem.py b627cf4cda1170c4a1a29609b0531334bb0c55ea 2020-09-12 13:25:59 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test MEM format driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # Copyright (c) 2008-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import struct from osgeo import gdal import gdaltest import pytest ############################################################################### # Create a MEM dataset, and set some data, then test it. def test_mem_1(): ####################################################### # Setup dataset drv = gdal.GetDriverByName('MEM') gdaltest.mem_ds = drv.Create('mem_1.mem', 50, 3) ds = gdaltest.mem_ds assert ds.GetProjection() == '', 'projection wrong' assert ds.GetGeoTransform(can_return_null=True) is None, 'geotransform wrong' raw_data = b''.join(struct.pack('f', v) for v in range(150)) ds.WriteRaster(0, 0, 50, 3, raw_data, buf_type=gdal.GDT_Float32, band_list=[1]) wkt = gdaltest.user_srs_to_wkt('EPSG:26711') ds.SetProjection(wkt) gt = (440720, 5, 0, 3751320, 0, -5) ds.SetGeoTransform(gt) band = ds.GetRasterBand(1) band.SetNoDataValue(-1.0) # Set GCPs() wkt_gcp = gdaltest.user_srs_to_wkt('EPSG:4326') gcps = [gdal.GCP(0, 1, 2, 3, 4)] ds.SetGCPs([], "") ds.SetGCPs(gcps, wkt_gcp) ds.SetGCPs([], "") ds.SetGCPs(gcps, wkt_gcp) ds.SetGCPs(gcps, wkt_gcp) ####################################################### # Verify dataset. assert band.GetNoDataValue() == -1.0, 'no data is wrong' assert ds.GetProjection() == wkt, 'projection wrong' assert ds.GetGeoTransform() == gt, 'geotransform wrong' assert band.Checksum() == 1531, 'checksum wrong' assert ds.GetGCPCount() == 1, 'GetGCPCount wrong' assert len(ds.GetGCPs()) == 1, 'GetGCPs wrong' assert ds.GetGCPProjection() == wkt_gcp, 'GetGCPProjection wrong' assert band.DeleteNoDataValue() == 0, 'wrong return code' assert band.GetNoDataValue() is None, 'got nodata value whereas none was expected' gdaltest.mem_ds = None ############################################################################### # Open an in-memory array. def test_mem_2(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('MEM:::') gdal.PopErrorHandler() assert ds is None, 'opening MEM dataset should have failed.' try: import ctypes except ImportError: pytest.skip() for libname in ['msvcrt', 'libc.so.6']: try: crt = ctypes.CDLL(libname) except OSError: crt = None if crt is not None: break if crt is None: pytest.skip() malloc = crt.malloc malloc.argtypes = [ctypes.c_size_t] malloc.restype = ctypes.c_void_p free = crt.free free.argtypes = [ctypes.c_void_p] free.restype = None # allocate band data array. width = 50 height = 3 p = malloc(width * height * 4) if p is None: pytest.skip() float_p = ctypes.cast(p, ctypes.POINTER(ctypes.c_float)) # build ds name. dsnames = ['MEM:::DATAPOINTER=0x%X,PIXELS=%d,LINES=%d,BANDS=1,DATATYPE=Float32,PIXELOFFSET=4,LINEOFFSET=%d,BANDOFFSET=0' % (p, width, height, width * 4), 'MEM:::DATAPOINTER=0x%X,PIXELS=%d,LINES=%d,DATATYPE=Float32' % (p, width, height)] for dsname in dsnames: for i in range(width * height): float_p[i] = 5.0 dsro = gdal.Open(dsname) if dsro is None: free(p) pytest.fail('opening MEM dataset failed in read only mode.') chksum = dsro.GetRasterBand(1).Checksum() if chksum != 750: print(chksum) free(p) pytest.fail('checksum failed.') dsro = None dsup = gdal.Open(dsname, gdal.GA_Update) if dsup is None: free(p) pytest.fail('opening MEM dataset failed in update mode.') dsup.GetRasterBand(1).Fill(100.0) dsup.FlushCache() if float_p[0] != 100.0: print(float_p[0]) free(p) pytest.fail('fill seems to have failed.') dsup = None free(p) ############################################################################### # Test creating a MEM dataset with the "MEM:::" name def test_mem_3(): drv = gdal.GetDriverByName('MEM') ds = drv.Create('MEM:::', 1, 1, 1) assert ds is not None ds = None ############################################################################### # Test creating a band interleaved multi-band MEM dataset def test_mem_4(): drv = gdal.GetDriverByName('MEM') ds = drv.Create('', 100, 100, 3) expected_cs = [0, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs[i], \ ('did not get expected checksum for band %d' % (i + 1)) ds.GetRasterBand(1).Fill(255) expected_cs = [57182, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs[i], \ ('did not get expected checksum for band %d after fill' % (i + 1)) ds = None ############################################################################### # Test creating a pixel interleaved multi-band MEM dataset def test_mem_5(): drv = gdal.GetDriverByName('MEM') ds = drv.Create('', 100, 100, 3, options=['INTERLEAVE=PIXEL']) expected_cs = [0, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs[i], \ ('did not get expected checksum for band %d' % (i + 1)) ds.GetRasterBand(1).Fill(255) expected_cs = [57182, 0, 0] for i in range(3): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs[i], \ ('did not get expected checksum for band %d after fill' % (i + 1)) assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'PIXEL', \ 'did not get expected INTERLEAVE value' ds = None ############################################################################### # Test out-of-memory situations def test_mem_6(): if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: pytest.skip() drv = gdal.GetDriverByName('MEM') # Multiplication overflow with gdaltest.error_handler(): ds = drv.Create('', 1, 1, 0x7FFFFFFF, gdal.GDT_Float64) assert ds is None ds = None # Multiplication overflow with gdaltest.error_handler(): ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 16) assert ds is None ds = None # Multiplication overflow with gdaltest.error_handler(): ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 1, gdal.GDT_Float64) assert ds is None ds = None # Out of memory error with gdaltest.error_handler(): ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 1, options=['INTERLEAVE=PIXEL']) assert ds is None ds = None # Out of memory error with gdaltest.error_handler(): ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 1) assert ds is None ds = None # 32 bit overflow on 32-bit builds, or possible out of memory error ds = drv.Create('', 0x7FFFFFFF, 1, 0) with gdaltest.error_handler(): ds.AddBand(gdal.GDT_Float64) # Will raise out of memory error in all cases ds = drv.Create('', 0x7FFFFFFF, 0x7FFFFFFF, 0) with gdaltest.error_handler(): ret = ds.AddBand(gdal.GDT_Float64) assert ret != 0 ############################################################################### # Test AddBand() def test_mem_7(): drv = gdal.GetDriverByName('MEM') ds = drv.Create('MEM:::', 1, 1, 1) ds.AddBand(gdal.GDT_Byte, []) assert ds.RasterCount == 2 ds = None ############################################################################### # Test SetDefaultHistogram() / GetDefaultHistogram() def test_mem_8(): drv = gdal.GetDriverByName('MEM') ds = drv.Create('MEM:::', 1, 1, 1) ds.GetRasterBand(1).SetDefaultHistogram(0, 255, []) ds.GetRasterBand(1).SetDefaultHistogram(1, 2, [5, 6]) ds.GetRasterBand(1).SetDefaultHistogram(1, 2, [3000000000, 4]) hist = ds.GetRasterBand(1).GetDefaultHistogram(force=0) ds = None assert hist == (1.0, 2.0, 2, [3000000000, 4]) ############################################################################### # Test RasterIO() def test_mem_9(): # Test IRasterIO(GF_Read,) src_ds = gdal.Open('data/rgbsmall.tif') drv = gdal.GetDriverByName('MEM') for interleave in ['BAND', 'PIXEL']: out_ds = drv.CreateCopy('', src_ds, options=['INTERLEAVE=%s' % interleave]) ref_data = src_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5) got_data = out_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5) if ref_data != got_data: import struct print(struct.unpack('B' * 4 * 5, ref_data)) print(struct.unpack('B' * 4 * 5, got_data)) pytest.fail(interleave) ref_data = src_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100) got_data = out_ds.GetRasterBand(2).ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100) assert ref_data == got_data, interleave ref_data = src_ds.ReadRaster(20, 8, 4, 5) got_data = out_ds.ReadRaster(20, 8, 4, 5) assert ref_data == got_data, interleave ref_data = src_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_band_space=1) got_data = out_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_band_space=1) assert ref_data == got_data, interleave out_ds.WriteRaster(20, 8, 4, 5, got_data, buf_pixel_space=3, buf_band_space=1) got_data = out_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_band_space=1) assert ref_data == got_data, interleave ref_data = src_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100, buf_band_space=1) got_data = out_ds.ReadRaster(20, 8, 4, 5, buf_pixel_space=3, buf_line_space=100, buf_band_space=1) assert ref_data == got_data, interleave ref_data = src_ds.ReadRaster(20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) got_data = out_ds.ReadRaster(20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) assert ref_data == got_data, interleave out_ds.WriteRaster(20, 20, 4, 5, got_data, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) got_data = out_ds.ReadRaster(20, 20, 4, 5, buf_type=gdal.GDT_Int32, buf_pixel_space=12, buf_band_space=4) assert ref_data == got_data, interleave # Test IReadBlock ref_data = src_ds.GetRasterBand(1).ReadRaster(0, 10, src_ds.RasterXSize, 1) # This is a bit nasty to have to do that. We should fix the core # to make that unnecessary out_ds.FlushCache() got_data = out_ds.GetRasterBand(1).ReadBlock(0, 10) assert ref_data == got_data, interleave # Test IRasterIO(GF_Write,) ref_data = src_ds.GetRasterBand(1).ReadRaster(2, 3, 4, 5) out_ds.GetRasterBand(1).WriteRaster(6, 7, 4, 5, ref_data) got_data = out_ds.GetRasterBand(1).ReadRaster(6, 7, 4, 5) assert ref_data == got_data # Test IRasterIO(GF_Write, change data type) + IWriteBlock() + IRasterIO(GF_Read, change data type) ref_data = src_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5, buf_type=gdal.GDT_Int32) out_ds.GetRasterBand(1).WriteRaster(10, 11, 4, 5, ref_data, buf_type=gdal.GDT_Int32) got_data = out_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5, buf_type=gdal.GDT_Int32) assert ref_data == got_data, interleave ref_data = src_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5) got_data = out_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5) assert ref_data == got_data, interleave # Test IRasterIO(GF_Write, resampling) + IWriteBlock() + IRasterIO(GF_Read, resampling) ref_data = src_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5) ref_data_zoomed = src_ds.GetRasterBand(1).ReadRaster(10, 11, 4, 5, 8, 10) out_ds.GetRasterBand(1).WriteRaster(10, 11, 8, 10, ref_data, 4, 5) got_data = out_ds.GetRasterBand(1).ReadRaster(10, 11, 8, 10) assert ref_data_zoomed == got_data, interleave got_data = out_ds.GetRasterBand(1).ReadRaster(10, 11, 8, 10, 4, 5) assert ref_data == got_data, interleave ############################################################################### # Test BuildOverviews() def test_mem_10(): # Error case: building overview on a 0 band dataset ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) with gdaltest.error_handler(): ds.BuildOverviews('NEAR', [2]) # Requesting overviews when they are not ds = gdal.GetDriverByName('MEM').Create('', 1, 1) assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(0) is None # Single band case ds = gdal.GetDriverByName('MEM').CreateCopy('', gdal.Open('data/byte.tif')) for _ in range(2): ret = ds.BuildOverviews('NEAR', [2]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 1 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 ret = ds.BuildOverviews('NEAR', [4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 328 ret = ds.BuildOverviews('NEAR', [2, 4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 328 # Test that average in one or several steps give the same result ds.GetRasterBand(1).GetOverview(0).Fill(0) ds.GetRasterBand(1).GetOverview(1).Fill(0) ret = ds.BuildOverviews('AVERAGE', [2, 4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1152 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 240 ds.GetRasterBand(1).GetOverview(0).Fill(0) ds.GetRasterBand(1).GetOverview(1).Fill(0) ret = ds.BuildOverviews('AVERAGE', [2]) ret = ds.BuildOverviews('AVERAGE', [4]) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 2 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1152 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 240 ds = None # Multiple band case ds = gdal.GetDriverByName('MEM').CreateCopy('', gdal.Open('data/rgbsmall.tif')) ret = ds.BuildOverviews('NEAR', [2]) assert ret == 0 cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 5057 cs = ds.GetRasterBand(2).GetOverview(0).Checksum() assert cs == 5304 cs = ds.GetRasterBand(3).GetOverview(0).Checksum() assert cs == 5304 ds = None # Clean overviews ds = gdal.GetDriverByName('MEM').CreateCopy('', gdal.Open('data/byte.tif')) ret = ds.BuildOverviews('NEAR', [2]) assert ret == 0 ret = ds.BuildOverviews('NONE', []) assert ret == 0 assert ds.GetRasterBand(1).GetOverviewCount() == 0 ds = None ############################################################################### # Test CreateMaskBand() def test_mem_11(): # Error case: building overview on a 0 band dataset ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) assert ds.CreateMaskBand(gdal.GMF_PER_DATASET) != 0 # Per dataset mask on single band dataset ds = gdal.GetDriverByName('MEM').Create('', 1, 1) assert ds.CreateMaskBand(gdal.GMF_PER_DATASET) == 0 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET mask = ds.GetRasterBand(1).GetMaskBand() cs = mask.Checksum() assert cs == 0 mask.Fill(255) cs = mask.Checksum() assert cs == 3 # Check that the per dataset mask is shared by all bands ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) assert ds.CreateMaskBand(gdal.GMF_PER_DATASET) == 0 mask1 = ds.GetRasterBand(1).GetMaskBand() mask1.Fill(255) mask2 = ds.GetRasterBand(2).GetMaskBand() cs = mask2.Checksum() assert cs == 3 # Same but call it on band 2 ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) assert ds.GetRasterBand(2).CreateMaskBand(gdal.GMF_PER_DATASET) == 0 mask2 = ds.GetRasterBand(2).GetMaskBand() mask2.Fill(255) mask1 = ds.GetRasterBand(1).GetMaskBand() cs = mask1.Checksum() assert cs == 3 # Per band masks ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2) assert ds.GetRasterBand(1).CreateMaskBand(0) == 0 assert ds.GetRasterBand(2).CreateMaskBand(0) == 0 mask1 = ds.GetRasterBand(1).GetMaskBand() mask2 = ds.GetRasterBand(2).GetMaskBand() mask2.Fill(255) cs1 = mask1.Checksum() cs2 = mask2.Checksum() assert cs1 == 0 and cs2 == 3 ############################################################################### # Test CreateMaskBand() and overviews. def test_mem_12(): # Test on per-band mask ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 2) ds.GetRasterBand(1).CreateMaskBand(0) ds.GetRasterBand(1).GetMaskBand().Fill(127) ds.BuildOverviews('NEAR', [2]) cs = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() assert cs == 267 # Default mask cs = ds.GetRasterBand(2).GetOverview(0).GetMaskBand().Checksum() assert cs == 283 # Test on per-dataset mask ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 2) ds.CreateMaskBand(gdal.GMF_PER_DATASET) ds.GetRasterBand(1).GetMaskBand().Fill(127) ds.BuildOverviews('NEAR', [2]) cs = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() assert cs == 267 cs2 = ds.GetRasterBand(2).GetOverview(0).GetMaskBand().Checksum() assert cs2 == cs ############################################################################### # Check RAT support def test_mem_rat(): ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ds.GetRasterBand(1).SetDefaultRAT(gdal.RasterAttributeTable()) assert ds.GetRasterBand(1).GetDefaultRAT() is not None ds.GetRasterBand(1).SetDefaultRAT(None) assert ds.GetRasterBand(1).GetDefaultRAT() is None ############################################################################### # Check CategoryNames support def test_mem_categorynames(): ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ds.GetRasterBand(1).SetCategoryNames(['foo']) assert ds.GetRasterBand(1).GetCategoryNames() == ['foo'] ds.GetRasterBand(1).SetCategoryNames([]) assert ds.GetRasterBand(1).GetCategoryNames() is None ############################################################################### # Check ColorTable support def test_mem_colortable(): ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ds.GetRasterBand(1).SetColorTable(ct) assert ds.GetRasterBand(1).GetColorTable().GetCount() == 1 ds.GetRasterBand(1).SetColorTable(None) assert ds.GetRasterBand(1).GetColorTable() is None ############################################################################### # Test dataset RasterIO with non nearest resampling def test_mem_dataset_rasterio_non_nearest_resampling_source_with_ovr(): ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 3) ds.GetRasterBand(1).Fill(255) ds.BuildOverviews('NONE', [2]) ds.GetRasterBand(1).GetOverview(0).Fill(10) got_data = ds.ReadRaster(0,0,10,10,5,5) got_data = struct.unpack('B' * 5 * 5 * 3, got_data) assert got_data[0] == 10 got_data = ds.ReadRaster(0,0,10,10,5,5,resample_alg=gdal.GRIORA_Cubic) got_data = struct.unpack('B' * 5 * 5 * 3, got_data) assert got_data[0] == 10 ############################################################################### # cleanup def test_mem_cleanup(): gdaltest.mem_ds = None gdalautotest-3.2.2/gdrivers/fujibas.py0000775000175000017500000000356014020414370016520 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: fujibas.py b737be8a5aa44e35ae4027f491b567af52f949e5 2020-05-10 17:48:42 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test FUJIBAS driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test a fake - and certainly incorrect - FUJIBAS dataset def test_fujibas_1(): tst = gdaltest.GDALTest('FujiBAS', 'fujibas/fakefujibas.pcb', 1, 1) return tst.testOpen() gdalautotest-3.2.2/gdrivers/lcp.py0000775000175000017500000007514414020414370015662 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: lcp.py 3dd6a46ebdb9311dfca262dd10a082d45ac57f5c 2020-05-10 14:28:24 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for LCP driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2009, Even Rouault # Copyright (c) 2013, Kyle Shannon # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest import pytest ############################################################################### # Test test_FARSITE_UTM12.LCP def test_lcp_1(): ds = gdal.Open('data/lcp/test_FARSITE_UTM12.LCP') assert ds.RasterCount == 8, 'wrong number of bands' assert ds.GetProjectionRef().find('NAD83 / UTM zone 12N') != -1, \ ("didn't get expect projection. Got : %s" % (ds.GetProjectionRef())) metadata = [('LATITUDE', '49'), ('LINEAR_UNIT', 'Meters'), ('DESCRIPTION', 'This is a test LCP file created with FARSITE 4.1.054, using data downloaded from the USGS \r\nNational Map for LANDFIRE (2008-05-06). Data were reprojected to UTM zone 12 on NAD83 \r\nusing gdalwarp (GDAL 1.4.2).\r\n')] md = ds.GetMetadata() for item in metadata: assert md[item[0]] == item[1], \ ('wrong metadataitem for dataset. md[\'%s\']=\'%s\', expected \'%s\'' % (item[0], md[item[0]], item[1])) check_gt = (285807.932887174887583, 30, 0, 5379230.386217921040952, 0, -30) new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=1e-5): print('') print('old = ', check_gt) print('new = ', new_gt) pytest.fail('Geotransform differs.') dataPerBand = [(18645, [('ELEVATION_UNIT', '0'), ('ELEVATION_UNIT_NAME', 'Meters'), ('ELEVATION_MIN', '1064'), ('ELEVATION_MAX', '1492'), ('ELEVATION_NUM_CLASSES', '-1'), ('ELEVATION_FILE', '')]), (16431, [('SLOPE_UNIT', '0'), ('SLOPE_UNIT_NAME', 'Degrees'), ('SLOPE_MIN', '0'), ('SLOPE_MAX', '34'), ('SLOPE_NUM_CLASSES', '36'), ('SLOPE_FILE', 'slope.asc')]), (18851, [('ASPECT_UNIT', '2'), ('ASPECT_UNIT_NAME', 'Azimuth degrees'), ('ASPECT_MIN', '0'), ('ASPECT_MAX', '357'), ('ASPECT_NUM_CLASSES', '-1'), ('ASPECT_FILE', 'aspect.asc')]), (26182, [('FUEL_MODEL_OPTION', '0'), ('FUEL_MODEL_OPTION_DESC', 'no custom models AND no conversion file needed'), ('FUEL_MODEL_MIN', '1'), ('FUEL_MODEL_MAX', '99'), ('FUEL_MODEL_NUM_CLASSES', '6'), ('FUEL_MODEL_VALUES', '1,2,5,8,10,99'), ('FUEL_MODEL_FILE', 'fbfm13.asc')]), (30038, [('CANOPY_COV_UNIT', '0'), ('CANOPY_COV_UNIT_NAME', 'Categories (0-4)'), ('CANOPY_COV_MIN', '0'), ('CANOPY_COV_MAX', '95'), ('CANOPY_COV_NUM_CLASSES', '10'), ('CANOPY_COV_FILE', 'cancov.asc')]), (22077, [('CANOPY_HT_UNIT', '3'), ('CANOPY_HT_UNIT_NAME', 'Meters x 10'), ('CANOPY_HT_MIN', '0'), ('CANOPY_HT_MAX', '375'), ('CANOPY_HT_NUM_CLASSES', '5'), ('CANOPY_HT_FILE', 'canht.asc')]), (30388, [('CBH_UNIT', '3'), ('CBH_UNIT_NAME', 'Meters x 10'), ('CBH_MIN', '0'), ('CBH_MAX', '100'), ('CBH_NUM_CLASSES', '33'), ('CBH_FILE', 'cbh.asc')]), (23249, [('CBD_UNIT', '3'), ('CBD_UNIT_NAME', 'kg/m^3 x 100'), ('CBD_MIN', '0'), ('CBD_MAX', '21'), ('CBD_NUM_CLASSES', '20'), ('CBD_FILE', 'cbd.asc')]) ] for i in range(8): band = ds.GetRasterBand(i + 1) assert band.Checksum() == dataPerBand[i][0], \ ('wrong checksum for band %d. Got %d, expected %d' % (i + 1, band.Checksum(), dataPerBand[i][0])) md = band.GetMetadata() for item in dataPerBand[i][1]: assert md[item[0]] == item[1], \ ('wrong metadataitem for band %d. md[\'%s\']=\'%s\', expected \'%s\'' % (i + 1, item[0], md[item[0]], item[1])) ds = None ############################################################################### # test test_USGS_LFNM_Alb83.lcp def test_lcp_2(): ds = gdal.Open('data/lcp/test_USGS_LFNM_Alb83.lcp') assert ds.RasterCount == 8, 'wrong number of bands' metadata = [('LATITUDE', '48'), ('LINEAR_UNIT', 'Meters'), ('DESCRIPTION', '')] md = ds.GetMetadata() for item in metadata: assert md[item[0]] == item[1], \ ('wrong metadataitem for dataset. md[\'%s\']=\'%s\', expected \'%s\'' % (item[0], md[item[0]], item[1])) check_gt = (-1328145, 30, 0, 2961735, 0, -30) new_gt = ds.GetGeoTransform() for i in range(6): if new_gt[i] != pytest.approx(check_gt[i], abs=1e-5): print('') print('old = ', check_gt) print('new = ', new_gt) pytest.fail('Geotransform differs.') dataPerBand = [(28381, [('ELEVATION_UNIT', '0'), ('ELEVATION_UNIT_NAME', 'Meters'), ('ELEVATION_MIN', '1064'), ('ELEVATION_MAX', '1492'), ('ELEVATION_NUM_CLASSES', '-1'), ('ELEVATION_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_elevation_1.txt')]), (25824, [('SLOPE_UNIT', '0'), ('SLOPE_UNIT_NAME', 'Degrees'), ('SLOPE_MIN', '0'), ('SLOPE_MAX', '34'), ('SLOPE_NUM_CLASSES', '35'), ('SLOPE_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_slope_1.txt')]), (28413, [('ASPECT_UNIT', '2'), ('ASPECT_UNIT_NAME', 'Azimuth degrees'), ('ASPECT_MIN', '0'), ('ASPECT_MAX', '357'), ('ASPECT_NUM_CLASSES', '-1'), ('ASPECT_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_aspect_1.txt')]), (19052, [('FUEL_MODEL_OPTION', '0'), ('FUEL_MODEL_OPTION_DESC', 'no custom models AND no conversion file needed'), ('FUEL_MODEL_MIN', '1'), ('FUEL_MODEL_MAX', '10'), ('FUEL_MODEL_NUM_CLASSES', '5'), ('FUEL_MODEL_VALUES', '1,2,5,8,10'), ('FUEL_MODEL_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_fuel1.txt')]), (30164, [('CANOPY_COV_UNIT', '1'), ('CANOPY_COV_UNIT_NAME', 'Percent'), ('CANOPY_COV_MIN', '0'), ('CANOPY_COV_MAX', '95'), ('CANOPY_COV_NUM_CLASSES', '10'), ('CANOPY_COV_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_canopy1.txt')]), (22316, [('CANOPY_HT_UNIT', '3'), ('CANOPY_HT_UNIT_NAME', 'Meters x 10'), ('CANOPY_HT_MIN', '0'), ('CANOPY_HT_MAX', '375'), ('CANOPY_HT_NUM_CLASSES', '5'), ('CANOPY_HT_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_height_1.txt')]), (30575, [('CBH_UNIT', '3'), ('CBH_UNIT_NAME', 'Meters x 10'), ('CBH_MIN', '0'), ('CBH_MAX', '100'), ('CBH_NUM_CLASSES', '33'), ('CBH_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_base_1.txt')]), (23304, [('CBD_UNIT', '3'), ('CBD_UNIT_NAME', 'kg/m^3 x 100'), ('CBD_MIN', '0'), ('CBD_MAX', '21'), ('CBD_NUM_CLASSES', '20'), ('CBD_FILE', 'd:\\scratch\\dist\\79990093\\Output\\rastert_density_1.txt')]) ] for i in range(8): band = ds.GetRasterBand(i + 1) assert band.Checksum() == dataPerBand[i][0], \ ('wrong checksum for band %d. Got %d, expected %d' % (i + 1, band.Checksum(), dataPerBand[i][0])) md = band.GetMetadata() for item in dataPerBand[i][1]: assert md[item[0]] == item[1], \ ('wrong metadataitem for band %d. md[\'%s\']=\'%s\', expected \'%s\'' % (i + 1, item[0], md[item[0]], item[1])) ds = None ############################################################################### # Test for empty prj def test_lcp_3(): ds = gdal.Open('data/lcp/test_USGS_LFNM_Alb83.lcp') assert ds is not None wkt = ds.GetProjection() assert wkt is not None, 'Got None from GetProjection()' ############################################################################### # Test that the prj file isn't added to the sibling list if it isn't there. def test_lcp_4(): ds = gdal.Open('data/lcp/test_USGS_LFNM_Alb83.lcp') assert ds is not None fl = ds.GetFileList() assert len(fl) == 1, 'Invalid file list' ############################################################################### # Test for valid prj def test_lcp_5(): ds = gdal.Open('data/lcp/test_FARSITE_UTM12.LCP') assert ds is not None wkt = ds.GetProjection() assert not (wkt is None or wkt == ''), 'Got invalid wkt from GetProjection()' ############################################################################### # Test for valid sibling list def test_lcp_6(): retval = 'success' ds = gdal.Open('data/lcp/test_FARSITE_UTM12.LCP') assert ds is not None fl = ds.GetFileList() if len(fl) != 2: gdaltest.post_reason('Invalid file list') retval = 'fail' ds = None try: os.remove('data/lcp/test_FARSITE_UTM12.LCP.aux.xml') except OSError: pass return retval ############################################################################### # Test create copy that copies data over def test_lcp_7(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None lcp_drv = gdal.GetDriverByName('LCP') assert lcp_drv is not None # Make sure all available band counts work. retval = 'success' co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] for i in [5, 7, 8, 10]: src_ds = mem_drv.Create('/vsimem/lcptest', 10, 20, i, gdal.GDT_Int16) assert src_ds is not None dst_ds = lcp_drv.CreateCopy('tmp/lcp_7.lcp', src_ds, False, co) if dst_ds is None: gdaltest.post_reason('Failed to create lcp with %d bands' % i) retval = 'fail' break dst_ds = None src_ds = None dst_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_7.' + ext) except OSError: pass return retval ############################################################################### # Test create copy with invalid bands def test_lcp_8(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None lcp_drv = gdal.GetDriverByName('LCP') assert lcp_drv is not None gdal.PushErrorHandler('CPLQuietErrorHandler') retval = 'success' co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] for i in [0, 1, 2, 3, 4, 6, 9, 11]: src_ds = mem_drv.Create('', 10, 10, i, gdal.GDT_Int16) if src_ds is None: retval = 'fail' break dst_ds = lcp_drv.CreateCopy('tmp/lcp_8.lcp', src_ds, False, co) src_ds = None if dst_ds is not None: gdaltest.post_reason('Created invalid lcp') retval = 'fail' dst_ds = None break dst_ds = None gdal.PopErrorHandler() for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_8.' + ext) except OSError: pass return retval ############################################################################### # Test create copy def test_lcp_9(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None lcp_drv = gdal.GetDriverByName('LCP') assert lcp_drv is not None src_ds = mem_drv.Create('', 10, 20, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] lcp_ds = lcp_drv.CreateCopy('tmp/lcp_9.lcp', src_ds, False, co) assert lcp_ds is not None lcp_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_9.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_10(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' for option in ['METERS', 'FEET']: co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'ELEVATION_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_10.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(1).GetMetadataItem("ELEVATION_UNIT_NAME") if units.lower() != option.lower(): gdaltest.post_reason('Could not set ELEVATION_UNIT') retval = 'fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_10.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_11(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' for option in ['DEGREES', 'PERCENT']: co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'SLOPE_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_11.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(2).GetMetadataItem("SLOPE_UNIT_NAME") if units.lower() != option.lower(): gdaltest.post_reason('Could not set SLOPE_UNIT') retval = 'fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_11.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_12(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' for option in ['GRASS_CATEGORIES', 'AZIMUTH_DEGREES', 'GRASS_DEGREES']: co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'ASPECT_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_12.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(3).GetMetadataItem("ASPECT_UNIT_NAME") if units.lower() != option.replace('_', ' ').lower(): gdaltest.post_reason('Could not set ASPECT_UNIT') retval = 'fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_12.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_13(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' for option in ['PERCENT', 'CATEGORIES']: co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CANOPY_COV_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_13.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(5).GetMetadataItem("CANOPY_COV_UNIT_NAME") if units.lower()[:10] != option.lower()[:10]: gdaltest.post_reason('Could not set CANOPY_COV_UNIT') retval = 'fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_13.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_14(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' for option in ['METERS', 'FEET', 'METERS_X_10', 'FEET_X_10']: co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CANOPY_HT_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_14.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(6).GetMetadataItem("CANOPY_HT_UNIT_NAME") if units.lower() != option.replace('_', ' ').lower(): gdaltest.post_reason('Could not set CANOPY_HT_UNIT') retval = 'fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_14.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_15(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' for option in ['METERS', 'FEET', 'METERS_X_10', 'FEET_X_10']: co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CBH_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_15.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(7).GetMetadataItem("CBH_UNIT_NAME") if units.lower() != option.replace('_', ' ').lower(): gdaltest.post_reason('Could not set CBH_UNIT') retval = 'fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'prj', 'lcp.aux.xml']: try: os.remove('tmp/lcp_15.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work def test_lcp_16(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' answers = ['kg/m^3', 'lb/ft^3', 'kg/m^3 x 100', 'lb/ft^3 x 1000', 'tons/acre x 100'] for i, option in enumerate(['KG_PER_CUBIC_METER', 'POUND_PER_CUBIC_FOOT', 'KG_PER_CUBIC_METER_X_100', 'POUND_PER_CUBIC_FOOT_X_1000']): co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'CBD_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_16.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(8).GetMetadataItem("CBD_UNIT_NAME") if units.lower() != answers[i].lower(): gdaltest.post_reason('Could not set CBD_UNIT') retval = 'fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_16.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure all unit metadata co work # It is unclear whether the metadata generated is correct, or the # documentation. Docs say mg/ha * 10 and tn/ac * 10, metadata is not * 10. def test_lcp_17(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' answers = ['mg/ha', 't/ac x 10'] for i, option in enumerate(['MG_PER_HECTARE_X_10', 'TONS_PER_ACRE_X_10']): co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'DUFF_UNIT=%s' % option] lcp_ds = drv.CreateCopy('tmp/lcp_17.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' break units = lcp_ds.GetRasterBand(9).GetMetadataItem("DUFF_UNIT_NAME") if units.lower() != answers[i].lower(): # gdaltest.post_reason('Could not set DUFF_UNIT') retval = 'expected_fail' lcp_ds = None break lcp_ds = None src_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_17.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure creation options work. def test_lcp_18(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' co = ['LATITUDE=45', 'LINEAR_UNIT=METER'] lcp_ds = drv.CreateCopy('tmp/lcp_18.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' if lcp_ds.GetMetadataItem('LATITUDE') != '45': gdaltest.post_reason('Failed to set LATITUDE creation option') retval = 'fail' src_ds = None lcp_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_18.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure creation options work. def test_lcp_19(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' co = ['LATITUDE=0', 'LINEAR_UNIT=FOOT'] lcp_ds = drv.CreateCopy('tmp/lcp_19.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' if lcp_ds.GetMetadataItem('LINEAR_UNIT') != 'Feet': gdaltest.post_reason('Failed to set LINEAR_UNIT creation option') retval = 'fail' src_ds = None lcp_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_19.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure DESCRIPTION co works def test_lcp_20(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' desc = 'test description' co = ['LATITUDE=0', 'LINEAR_UNIT=METER', 'DESCRIPTION=%s' % desc] lcp_ds = drv.CreateCopy('tmp/lcp_20.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' if lcp_ds.GetMetadataItem('DESCRIPTION') != desc: gdaltest.post_reason('Failed to set DESCRIPTION creation option') retval = 'fail' src_ds = None lcp_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_20.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make data is copied over via checksums def test_lcp_21(): try: import random import struct except ImportError: pytest.skip() mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 3, 3, 10, gdal.GDT_Int16) assert src_ds is not None for i in range(10): data = [random.randint(0, 100) for i in range(9)] src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 3, 3, struct.pack('h' * 9, *data)) co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] lcp_ds = drv.CreateCopy('tmp/lcp_21.lcp', src_ds, False, co) if lcp_ds is None: retval = 'fail' retval = 'success' for i in range(10): if src_ds.GetRasterBand(i + 1).Checksum() != lcp_ds.GetRasterBand(i + 1).Checksum(): gdaltest.post_reason('Did not get expected checksum') retval = 'fail' src_ds = None lcp_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_21.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make data is copied over via numpy comparison. def test_lcp_22(): try: import random import struct import numpy except ImportError: pytest.skip() mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 3, 3, 10, gdal.GDT_Int16) assert src_ds is not None for i in range(10): data = [random.randint(0, 100) for i in range(9)] src_ds.GetRasterBand(i + 1).WriteRaster(0, 0, 3, 3, struct.pack('h' * 9, *data)) retval = 'success' co = ['LATITUDE=0', 'LINEAR_UNIT=METER'] lcp_ds = drv.CreateCopy('tmp/lcp_22.lcp', src_ds, False, co) assert lcp_ds is not None retval = 'success' for i in range(10): src_data = src_ds.GetRasterBand(i + 1).ReadAsArray() dst_data = lcp_ds.GetRasterBand(i + 1).ReadAsArray() if not numpy.array_equal(src_data, dst_data): gdaltest.post_reason('Did not copy data correctly') retval = 'fail' src_ds = None lcp_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_22.' + ext) except OSError: pass return retval ############################################################################### # Test create copy and make sure invalid creation options are caught. def test_lcp_23(): mem_drv = gdal.GetDriverByName('MEM') assert mem_drv is not None drv = gdal.GetDriverByName('LCP') assert drv is not None src_ds = mem_drv.Create('/vsimem/', 10, 10, 10, gdal.GDT_Int16) assert src_ds is not None retval = 'success' bad = 'NOT_A_REAL_OPTION' gdal.PushErrorHandler('CPLQuietErrorHandler') for option in ['ELEVATION_UNIT', 'SLOPE_UNIT', 'ASPECT_UNIT', 'FUEL_MODEL_OPTION', 'CANOPY_COV_UNIT', 'CANOPY_HT_UNIT', 'CBH_UNIT', 'CBD_UNIT', 'DUFF_UNIT']: co = ['%s=%s' % (option, bad), ] lcp_ds = drv.CreateCopy('tmp/lcp_23.lcp', src_ds, False, co) if lcp_ds is not None: retval = 'fail' gdal.PopErrorHandler() src_ds = None lcp_ds = None for ext in ['lcp', 'lcp.aux.xml']: try: os.remove('tmp/lcp_23.' + ext) except OSError: pass return retval gdalautotest-3.2.2/gdrivers/jpeg2000.py0000775000175000017500000003372114020414370016326 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: jpeg2000.py b6c71e69565f9e1a99d8ad3a3c7ac8903904e49f 2020-10-09 14:54:43 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for Jasper/JP2ECW driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2009-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest pytestmark = pytest.mark.require_driver('JPEG2000') gdaltest.buggy_jasper = None def is_buggy_jasper(): if gdaltest.buggy_jasper is not None: return gdaltest.buggy_jasper gdaltest.buggy_jasper = False if gdal.GetDriverByName('JPEG2000') is None: return False # This test will cause a crash with an unpatched version of Jasper, such as the one of Ubuntu 8.04 LTS # --> "jpc_dec.c:1072: jpc_dec_tiledecode: Assertion `dec->numcomps == 3' failed." # Recent Debian/Ubuntu have the appropriate patch. # So we try to run in a subprocess first import test_cli_utilities if test_cli_utilities.get_gdalinfo_path() is not None: ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --config GDAL_SKIP "JP2ECW JP2MRSID JP2KAK JP2LURA JP2OpenJPEG" data/jpeg2000/3_13bit_and_1bit.jp2') if ret.find('Band 1') == -1: gdaltest.post_reason('Jasper library would need patches') gdaltest.buggy_jasper = True return True return False ############################################################################### @pytest.fixture(autouse=True, scope='module') def startup_and_cleanup(): gdaltest.jpeg2000_drv = gdal.GetDriverByName('JPEG2000') assert gdaltest.jpeg2000_drv is not None gdaltest.deregister_all_jpeg2000_drivers_but('JPEG2000') yield gdaltest.reregister_all_jpeg2000_drivers() ############################################################################### # Open byte.jp2 def test_jpeg2000_2(): srs = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26711"]] """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('JPEG2000', 'jpeg2000/byte.jp2', 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Open int16.jp2 def test_jpeg2000_3(): ds = gdal.Open('data/jpeg2000/int16.jp2') ds_ref = gdal.Open('data/int16.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Quite a bit of difference... assert maxdiff <= 6, 'Image too different from reference' ############################################################################### # Test copying byte.jp2 def test_jpeg2000_4(): tst = gdaltest.GDALTest('JPEG2000', 'jpeg2000/byte.jp2', 1, 50054) tst.testCreateCopy() # This may fail for a good reason if tst.testCreateCopy(check_gt=1, check_srs=1) != 'success': gdaltest.post_reason('This is an expected failure if Jasper has not the jp2_encode_uuid function') return 'expected_fail' ############################################################################### # Test copying int16.jp2 def test_jpeg2000_5(): tst = gdaltest.GDALTest('JPEG2000', 'jpeg2000/int16.jp2', 1, None) return tst.testCreateCopy() ############################################################################### # Test reading ll.jp2 def test_jpeg2000_6(): tst = gdaltest.GDALTest('JPEG2000', 'jpeg2000/ll.jp2', 1, None) tst.testOpen() ds = gdal.Open('data/jpeg2000/ll.jp2') ds.GetRasterBand(1).Checksum() ds = None ############################################################################### # Open byte.jp2.gz (test use of the VSIL API) def test_jpeg2000_7(): tst = gdaltest.GDALTest('JPEG2000', '/vsigzip/data/jpeg2000/byte.jp2.gz', 1, 50054, filename_absolute=1) ret = tst.testOpen() gdal.Unlink('data/jpeg2000/byte.jp2.gz.properties') return ret ############################################################################### # Test a JPEG2000 with the 3 bands having 13bit depth and the 4th one 1 bit def test_jpeg2000_8(): if is_buggy_jasper(): pytest.skip() ds = gdal.Open('data/jpeg2000/3_13bit_and_1bit.jp2') expected_checksums = [64570, 57277, 56048, 61292] for i in range(4): assert ds.GetRasterBand(i + 1).Checksum() == expected_checksums[i], \ ('unexpected checksum (%d) for band %d' % (expected_checksums[i], i + 1)) assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, 'unexpected data type' ############################################################################### # Check that we can use .j2w world files (#4651) def test_jpeg2000_9(): ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ 'geotransform differs from expected' ds = None ############################################################################### # Check writing a file with more than 4 bands (#4686) def test_jpeg2000_10(): src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/jpeg2000_10_src.tif', 128, 128, 5) for i in range(src_ds.RasterCount): src_ds.GetRasterBand(i + 1).Fill(10 * i + 1) ds = gdaltest.jpeg2000_drv.CreateCopy('/vsimem/jpeg2000_10_dst.tif', src_ds) ds = None ds = gdal.Open('/vsimem/jpeg2000_10_dst.tif') assert ds is not None for i in range(src_ds.RasterCount): assert ds.GetRasterBand(i + 1).Checksum() == src_ds.GetRasterBand(i + 1).Checksum(), \ ('bad checksum for band %d' % (i + 1)) ds = None src_ds = None gdal.Unlink('/vsimem/jpeg2000_10_src.tif') gdal.Unlink('/vsimem/jpeg2000_10_dst.tif') ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit def test_jpeg2000_11(): if is_buggy_jasper(): pytest.skip() ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) jp2_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/jpeg2000_11.tif', ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) gtiff_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) # gtiff_fourth_band_subsampled_data = fourth_band.ReadRaster(0,0,ds.RasterXSize,ds.RasterYSize,ds.RasterXSize/16,ds.RasterYSize/16) tmp_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/jpeg2000_11.tif') assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data assert jp2_fourth_band_data == gtiff_fourth_band_data ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ############################################################################### def test_jpeg2000_online_1(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k', '7sisters200.j2k'): pytest.skip() # Checksum = 32669 on my PC tst = gdaltest.GDALTest('JPEG2000', 'tmp/cache/7sisters200.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/7sisters200.j2k') ds.GetRasterBand(1).Checksum() ds = None ############################################################################### def test_jpeg2000_online_2(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2', 'gcp.jp2'): pytest.skip() # Checksum = 15621 on my PC tst = gdaltest.GDALTest('JPEG2000', 'tmp/cache/gcp.jp2', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/gcp.jp2') ds.GetRasterBand(1).Checksum() assert len(ds.GetGCPs()) == 15, 'bad number of GCP' expected_wkt = """GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]""" assert ds.GetGCPProjection() == expected_wkt, 'bad GCP projection' ds = None ############################################################################### def test_jpeg2000_online_3(): if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.j2k', 'Bretagne1.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.bmp', 'Bretagne1.bmp'): pytest.skip() # Checksum = 14443 on my PC tst = gdaltest.GDALTest('JPEG2000', 'tmp/cache/Bretagne1.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/Bretagne1.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne1.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Difference between the image before and after compression assert maxdiff <= 17, 'Image too different from reference' ############################################################################### def test_jpeg2000_online_4(): if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.j2k', 'Bretagne2.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.bmp', 'Bretagne2.bmp'): pytest.skip() tst = gdaltest.GDALTest('JPEG2000', 'tmp/cache/Bretagne2.j2k', 1, None, filename_absolute=1) # Jasper cannot handle this image # Actually, a patched Jasper can ;-) if tst.testOpen() != 'success': gdaltest.post_reason('Expected failure: Jasper cannot handle this image yet') return 'expected_fail' ds = gdal.Open('tmp/cache/Bretagne2.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne2.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Difference between the image before and after compression assert maxdiff <= 17, 'Image too different from reference' ############################################################################### # Try reading JPEG2000 with color table def test_jpeg2000_online_5(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_09/file9.jp2', 'file9.jp2'): pytest.skip() ds = gdal.Open('tmp/cache/file9.jp2') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() assert cs1 == 48954 and cs2 == 4939 and cs3 == 17734, \ 'Did not get expected checksums' ds = None ############################################################################### # Try reading YCbCr JPEG2000 as RGB def test_jpeg2000_online_6(): if not gdaltest.download_file('http://www.gwg.nga.mil/ntb/baseline/software/testfile/Jpeg2000/jp2_03/file3.jp2', 'file3.jp2'): pytest.skip() ds = gdal.Open('tmp/cache/file3.jp2') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() assert cs1 == 25337 and cs2 == 28262 and cs3 == 59580, \ 'Did not get expected checksums' ds = None gdalautotest-3.2.2/gdrivers/ida.py0000775000175000017500000001444514020414370015636 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ida.py 43d56b1ca0ba482bf60527125f29bcb6c19f1543 2020-05-10 17:40:05 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test IDA format driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Perform simple read test. def test_ida_1(): tst = gdaltest.GDALTest('ida', 'ida/DWI01012.AFC', 1, 4026) return tst.testOpen() ############################################################################### # Verify some auxiliary data. def test_ida_2(): ds = gdal.Open('data/ida/DWI01012.AFC') gt = ds.GetGeoTransform() if gt[0] != -17.875 or gt[1] != 0.25 or gt[2] != 0 \ or gt[3] != 37.875 or gt[4] != 0 or gt[5] != -0.25: print('got: ', gt) pytest.fail('Aaigrid geotransform wrong.') prj = ds.GetProjection() assert 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', \ ('Projection does not match expected:\n%s' % prj) band1 = ds.GetRasterBand(1) assert band1.GetNoDataValue() == 255, 'Grid NODATA value wrong or missing.' assert band1.DataType == gdal.GDT_Byte, 'Data type is not byte.' ############################################################################### # Create simple copy and check. def test_ida_3(): tst = gdaltest.GDALTest('ida', 'ida/DWI01012.AFC', 1, 4026) prj = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]]' return tst.testCreateCopy(check_gt=0, check_srs=prj, check_minmax=1) ############################################################################### # Test ACEA Projection. def test_ida_4(): gdaltest.ida_tst = gdaltest.GDALTest('ida', 'ida/DWI01012.AFC', 1, 4026) prj = """PROJCS["unnamed", GEOGCS["Clarke 1866", DATUM["Clarke 1866", SPHEROID["Clarke 1866",6378206.4,293.9786982138966]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Albers_Conic_Equal_Area"], PARAMETER["standard_parallel_1",10], PARAMETER["standard_parallel_2",25], PARAMETER["latitude_of_center",17.5], PARAMETER["longitude_of_center",-87.5], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["meter",1]]""" return gdaltest.ida_tst.testSetProjection(prj=prj) ############################################################################### # Test Goodes Projection. def test_ida_5(): gdaltest.ida_tst = gdaltest.GDALTest('ida', 'ida/DWI01012.AFC', 1, 4026) prj = """PROJCS["unnamed", GEOGCS["Sphere", DATUM["Sphere", SPHEROID["Sphere",6370997,0]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Goode_Homolosine"], PARAMETER["central_meridian",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["meter",1]]""" return gdaltest.ida_tst.testSetProjection(prj=prj) ############################################################################### # Test LCC Projection. def test_ida_6(): gdaltest.ida_tst = gdaltest.GDALTest('ida', 'ida/DWI01012.AFC', 1, 4026) prj = """PROJCS["unnamed", GEOGCS["Clarke 1866", DATUM["Clarke 1866", SPHEROID["Clarke 1866",6378206.4,293.9786982138966]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",33.90363402775256], PARAMETER["standard_parallel_2",33.62529002776137], PARAMETER["latitude_of_origin",33.76446202775696], PARAMETER["central_meridian",-117.4745428888127], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["meter",1]]""" return gdaltest.ida_tst.testSetProjection(prj=prj) ############################################################################### # Test LAEA Projection. def test_ida_7(): gdaltest.ida_tst = gdaltest.GDALTest('ida', 'ida/DWI01012.AFC', 1, 4026) prj = """PROJCS["unnamed", GEOGCS["Sphere", DATUM["Sphere", SPHEROID["Sphere",6370997,0]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Azimuthal_Equal_Area"], PARAMETER["latitude_of_center",33.76446202775696], PARAMETER["longitude_of_center",-117.4745428888127], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["meter",1]]""" return gdaltest.ida_tst.testSetProjection(prj=prj) gdalautotest-3.2.2/gdrivers/netcdf_cfchecks.py0000775000175000017500000034061414020414370020175 0ustar eveneven#!/usr/bin/env python ############################################################################### # $Id: netcdf_cfchecks.py b55a33407a80673ec314b165c82f47dd02e9dc9c 2020-04-27 20:37:55 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test NetCDF driver CF compliance. # Author: Etienne Tourigny # ############################################################################### # No copyright in original script... apparently under BSD licence # original can be found at http://pypi.python.org/pypi/cfchecker # # Slightly modified to please pyflakes and being imported by Python3 (but # actually untested with python3) ############################################################################### # Adapted for numpy/ma/cdms2 by convertcdms.py # ------------------------------------------------------------- # Name: cfchecks.py # # Author: Rosalyn Hatcher - Met Office, UK # # Maintainer: Rosalyn Hatcher - NCAS-CMS, Univ. of Reading, UK # # # File Revision: # # CF Checker Version: 2.0.9-gdal # # ------------------------------------------------------------- ''' cfchecker [-a|--area_types area_types.xml] [-s|--cf_standard_names standard_names.xml] [-u|--udunits udunits.dat] [-v|--version CFVersion] file1 [file2...] Description: The cfchecker checks NetCDF files for compliance to the CF standard. Options: -a or --area_types: the location of the CF area types table (xml) -s or --cf_standard_names: the location of the CF standard name table (xml) -u or --udunits: the location of the udunits.dat file -h or --help: Prints this help text. -v or --version: CF version to check against, use auto to auto-detect the file version. ''' import re import sys import ctypes from xml.sax import ContentHandler from xml.sax import make_parser from xml.sax.handler import feature_namespaces import numpy import cdms2 as cdms from cdms2.axis import FileAxis from cdms2.auxcoord import FileAuxAxis1D # Use ctypes to interface to the UDUNITS-2 shared library # The udunits2 library needs to be in a standard path o/w export LD_LIBRARY_PATH udunits = ctypes.CDLL("libudunits2.so") STANDARDNAME = 'http://cfconventions.org/Data/cf-standard-names/current/src/cf-standard-name-table.xml' AREATYPES = 'http://cfconventions.org/Data/area-type-table/current/src/area-type-table.xml' # ----------------------------------------------------------- def normalize_whitespace(text): "Remove redundant whitespace from a string." return ' '.join(text.split()) def my_cmp(a, b): return (a > b) - (a < b) class CFVersion(object): """A CF version number, stored as a tuple, that can be instantiated with a tuple or a string, written out as a string, and compared with another version""" def __init__(self, value=()): "Instantiate CFVersion with a string or with a tuple of ints" if isinstance(value, str): if value.startswith("CF-"): value = value[3:] self.tuple = map(int, value.split(".")) else: self.tuple = value def __nonzero__(self): return bool(self.tuple) def __str__(self): return "CF-%s" % '.'.join(map(str, self.tuple)) def __cmp__(self, other): # maybe overkill but allow for different lengths in future e.g. 3.2 and 3.2.1 pos = 0 while True: in_s = (pos < len(self.tuple)) in_o = (pos < len(other.tuple)) if in_s: if in_o: c = my_cmp(self.tuple[pos], other.tuple[pos]) if c != 0: return c # e.g. 1.x <=> 1.y else: # in_s and not in_o return 1 # e.g. 3.2.1 > 3.2 else: if in_o: # and not in_s return -1 # e.g. 3.2 < 3.2.1 # not in_s and not in_o return 0 # e.g. 3.2 == 3.2 pos += 1 vn1_0 = CFVersion((1, 0)) vn1_1 = CFVersion((1, 1)) vn1_2 = CFVersion((1, 2)) vn1_3 = CFVersion((1, 3)) vn1_4 = CFVersion((1, 4)) vn1_5 = CFVersion((1, 5)) vn1_6 = CFVersion((1, 6)) cfVersions = [vn1_0, vn1_1, vn1_2, vn1_3, vn1_4, vn1_5, vn1_6] newest_version = max(cfVersions) class ConstructDict(ContentHandler): """Parse the xml standard_name table, reading all entries into a dictionary; storing standard_name and units. """ def __init__(self): self.inUnitsContent = 0 self.inEntryIdContent = 0 self.inVersionNoContent = 0 self.inLastModifiedContent = 0 self.dict = {} def startElement(self, name, attrs): # If it's an entry element, save the id if name == 'entry': self.this_id = normalize_whitespace(attrs.get('id', "")) # If it's the start of a canonical_units element elif name == 'canonical_units': self.inUnitsContent = 1 self.units = "" elif name == 'alias': self.this_id = normalize_whitespace(attrs.get('id', "")) elif name == 'entry_id': self.inEntryIdContent = 1 self.entry_id = "" elif name == 'version_number': self.inVersionNoContent = 1 self.version_number = "" elif name == 'last_modified': self.inLastModifiedContent = 1 self.last_modified = "" def characters(self, ch): if self.inUnitsContent: self.units = self.units + ch elif self.inEntryIdContent: self.entry_id = self.entry_id + ch elif self.inVersionNoContent: self.version_number = self.version_number + ch elif self.inLastModifiedContent: self.last_modified = self.last_modified + ch def endElement(self, name): # If it's the end of the canonical_units element, save the units if name == 'canonical_units': self.inUnitsContent = 0 self.units = normalize_whitespace(self.units) self.dict[self.this_id] = self.units # If it's the end of the entry_id element, find the units for the self.alias elif name == 'entry_id': self.inEntryIdContent = 0 self.entry_id = normalize_whitespace(self.entry_id) try: self.dict[self.this_id] = self.dict[self.entry_id] except KeyError: print("") print("**WARNING** Error in standard_name table: entry_id '" + self.entry_id + "' not found") print("Please contact Rosalyn Hatcher (r.s.hatcher@reading.ac.uk)") print("") # If it's the end of the version_number element, save it elif name == 'version_number': self.inVersionNoContent = 0 self.version_number = normalize_whitespace(self.version_number) # If it's the end of the last_modified element, save the last modified date elif name == 'last_modified': self.inLastModifiedContent = 0 self.last_modified = normalize_whitespace(self.last_modified) class ConstructList(ContentHandler): """Parse the xml area_type table, reading all area_types into a list. """ def __init__(self): self.inVersionNoContent = 0 self.inLastModifiedContent = 0 self.list = [] def startElement(self, name, attrs): # If it's an entry element, save the id if name == 'entry': self.list.append(normalize_whitespace(attrs.get('id', ""))) elif name == 'version_number': self.inVersionNoContent = 1 self.version_number = "" elif name == 'date': self.inLastModifiedContent = 1 self.last_modified = "" def characters(self, ch): if self.inVersionNoContent: self.version_number = self.version_number + ch elif self.inLastModifiedContent: self.last_modified = self.last_modified + ch def endElement(self, name): # If it's the end of the version_number element, save it if name == 'version_number': self.inVersionNoContent = 0 self.version_number = normalize_whitespace(self.version_number) # If it's the end of the date element, save the last modified date elif name == 'date': self.inLastModifiedContent = 0 self.last_modified = normalize_whitespace(self.last_modified) def chkDerivedName(name): """Checks whether name is a derived standard name and adheres to the transformation rules. See CF standard names document for more information. """ if re.search("^(direction|magnitude|square|divergence)_of_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^rate_of_change_of_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^(grid_)?(northward|southward|eastward|westward)_derivative_of_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^product_of_[a-zA-Z][a-zA-Z0-9_]*_and_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^ratio_of_[a-zA-Z][a-zA-Z0-9_]*_to_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^derivative_of_[a-zA-Z][a-zA-Z0-9_]*_wrt_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^(correlation|covariance)_over_[a-zA-Z][a-zA-Z0-9_]*_of_[a-zA-Z][a-zA-Z0-9_]*_and_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^histogram_over_[a-zA-Z][a-zA-Z0-9_]*_of_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^probability_distribution_over_[a-zA-Z][a-zA-Z0-9_]*_of_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 if re.search("^probability_density_function_over_[a-zA-Z][a-zA-Z0-9_]*_of_[a-zA-Z][a-zA-Z0-9_]*$", name): return 0 # Not a valid derived name return 1 # ====================== # Checking class # ====================== class CFChecker(object): def __init__(self, uploader=None, useFileName="yes", badc=None, coards=None, cfStandardNamesXML=None, cfAreaTypesXML=None, udunitsDat=None, version=newest_version): self.uploader = uploader self.useFileName = useFileName self.badc = badc self.coards = coards self.standardNames = cfStandardNamesXML self.areaTypes = cfAreaTypesXML self.udunits = udunitsDat self.version = version self.err = 0 self.warn = 0 self.info = 0 self.cf_roleCount = 0 # Number of occurrences of the cf_role attribute in the file self.raggedArrayFlag = 0 # Flag to indicate if file contains any ragged array representations def checker(self, filename): fileSuffix = re.compile('^\S+\.nc$') print("") if self.uploader: realfile = filename.split(".nc")[0] + ".nc" print("CHECKING NetCDF FILE:", realfile) elif self.useFileName == "no": print("CHECKING NetCDF FILE") else: print("CHECKING NetCDF FILE:", filename) print("=====================") # Check for valid filename if not fileSuffix.match(filename): print("ERROR (2.1): Filename must have .nc suffix") exit(1) # Initialize udunits-2 package # (Temporarily ignore messages to std error stream to prevent "Definition override" warnings # being displayed see Trac #50) # Use ctypes callback functions to declare ut_error_message_handler (uemh) # Don't fully understand why this works! Solution supplied by ctypes-mailing-list. 19.01.10 uemh = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p) ut_set_error_message_handler = ctypes.CFUNCTYPE(uemh, uemh)(("ut_set_error_message_handler", udunits)) ut_write_to_stderr = uemh(("ut_write_to_stderr", udunits)) ut_ignore = uemh(("ut_ignore", udunits)) # old_handler = ut_set_error_message_handler(ut_ignore) # if self.udunits=None this will load the UDUNITS2 xml file from the default place self.unitSystem = udunits.ut_read_xml(self.udunits) if not self.unitSystem: exit("Could not read the UDUNITS2 xml database from: %s" % self.udunits) # old_handler = ut_set_error_message_handler(ut_write_to_stderr) # Read in netCDF file try: self.f = cdms.open(filename, "r") except AttributeError: print("NetCDF Attribute Error:") raise except: print("\nCould not open file, please check that NetCDF is formatted correctly.\n".upper()) print("ERRORS detected:", 1) raise # if 'auto' version, check the CF version in the file # if none found, use the default if not self.version: self.version = self.getFileCFVersion() if not self.version: print("WARNING: Cannot determine CF version from the Conventions attribute; checking against latest CF version:", newest_version) self.warn = self.warn + 1 self.version = newest_version # Set up dictionary of all valid attributes, their type and use self.setUpAttributeList() # Set up dictionary of standard_names and their assoc. units parser = make_parser() parser.setFeature(feature_namespaces, 0) self.std_name_dh = ConstructDict() parser.setContentHandler(self.std_name_dh) parser.parse(self.standardNames) if self.version >= vn1_4: # Set up list of valid area_types self.area_type_lh = ConstructList() parser.setContentHandler(self.area_type_lh) parser.parse(self.areaTypes) print("Using CF Checker Version 2.0.9-gdal") if not self.version: print("Checking against CF Version (auto)") else: print("Checking against CF Version %s" % self.version) print("Using Standard Name Table Version " + self.std_name_dh.version_number + " (" + self.std_name_dh.last_modified + ")") if self.version >= vn1_4: print("Using Area Type Table Version " + self.area_type_lh.version_number + " (" + self.area_type_lh.last_modified + ")") print("") # Read in netCDF file try: self.f = cdms.open(filename, "r") except AttributeError: print("NetCDF Attribute Error:") raise except: print("\nCould not open file, please check that NetCDF is formatted correctly.\n".upper()) print("ERRORS detected:", 1) raise try: return self._checker() finally: self.f.close() def _checker(self): """ Main implementation of checker assuming self.f exists. """ lowerVars = [] rc = 1 # Check global attributes if not self.chkGlobalAttributes(): rc = 0 (coordVars, auxCoordVars, boundsVars, climatologyVars, gridMappingVars) = self.getCoordinateDataVars() self.coordVars = coordVars self.auxCoordVars = auxCoordVars self.boundsVars = boundsVars self.climatologyVars = climatologyVars self.gridMappingVars = gridMappingVars # print "Auxiliary Coordinate Vars:",auxCoordVars # print "Coordinate Vars: ",coordVars allCoordVars = coordVars[:] allCoordVars[len(allCoordVars):] = auxCoordVars[:] self.setUpFormulas() axes = self.f.axes.keys() # Check each variable for var in self.f._file_.variables.keys(): print("") print("------------------") print("Checking variable:", var) print("------------------") if not self.validName(var): print("ERROR (2.3): Invalid variable name -", var) self.err = self.err + 1 rc = 0 # Check to see if a variable with this name already exists (case-insensitive) lowerVar = var.lower() if lowerVar in lowerVars: print("WARNING (2.3): variable clash:-", var) self.warn = self.warn + 1 else: lowerVars.append(lowerVar) if var not in axes: # Non-coordinate variable if not self.chkDimensions(var, allCoordVars): rc = 0 if not self.chkDescription(var): rc = 0 for attribute in self.f[var].attributes.keys(): if not self.chkAttribute(attribute, var, allCoordVars): rc = 0 if not self.chkUnits(var, allCoordVars): rc = 0 if not self.chkValidMinMaxRange(var): rc = 0 if not self.chk_FillValue(var): rc = 0 if not self.chkAxisAttribute(var): rc = 0 if not self.chkPositiveAttribute(var): rc = 0 if not self.chkCellMethods(var): rc = 0 if not self.chkCellMeasures(var): rc = 0 if not self.chkFormulaTerms(var, allCoordVars): rc = 0 if not self.chkCompressAttr(var): rc = 0 if not self.chkPackedData(var): rc = 0 if self.version >= vn1_3: # Additional conformance checks from CF-1.3 onwards if not self.chkFlags(var): rc = 0 if self.version >= vn1_6: # Additional conformance checks from CF-1.6 onwards if not self.chkCFRole(var): rc = 0 if not self.chkRaggedArray(var): rc = 0 if var in coordVars: if not self.chkMultiDimCoord(var, axes): rc = 0 if not self.chkValuesMonotonic(var): rc = 0 if var in gridMappingVars: if not self.chkGridMappingVar(var): rc = 0 # print "Axes:",axes if var in axes: # Check var is a FileAxis. If not then there may be a problem with its declaration. # I.e. Multi-dimensional coordinate var with a dimension of the same name # or an axis that hasn't been identified through the coordinates attribute # CRM035 (17.04.07) if not isinstance(self.f[var], (FileAxis, FileAuxAxis1D)): print("WARNING (5): Possible incorrect declaration of a coordinate variable.") self.warn = self.warn + 1 else: if self.f[var].isTime(): if not self.chkTimeVariableAttributes(var): rc = 0 if rc: pass # print self.cf_roleCount,"variable(s) have the cf_role attribute set" if self.version >= vn1_6: print(" ") if self.raggedArrayFlag != 0 and 'featureType' not in self.f.attributes: print("ERROR (9.4): The global attribute 'featureType' must be present (A ragged array representation has been used)") self.err = self.err + 1 if 'featureType' in self.f.attributes: featureType = self.f.attributes['featureType'] if self.cf_roleCount == 0 and featureType != "point": print("WARNING (9.5): A variable with the attribute cf_role should be included in a Discrete Geometry CF File") self.warn = self.warn + 1 if re.match('^(timeSeries|trajectory|profile)$', featureType, re.I) and self.cf_roleCount != 1: # Should only be a single occurrence of a cf_role attribute print("WARNING (9.5): CF Files containing", featureType, "featureType should only include a single occurrence of a cf_role attribute") self.warn = self.warn + 1 elif re.match('^(timeSeriesProfile|trajectoryProfile)$', featureType, re.I) and self.cf_roleCount > 2: # May contain up to 2 occurrences of cf_roles attribute print("ERROR (9.5): CF Files containing", featureType, "featureType may contain 2 occurrences of a cf_role attribute") self.err = self.err + 1 print("") print("ERRORS detected:", self.err) print("WARNINGS given:", self.warn) print("INFORMATION messages:", self.info) if self.err: # Return number of errors found return self.err if self.warn: # No errors, but some warnings found return -(self.warn) # No errors or warnings - return success! return 0 # ----------------------------- def setUpAttributeList(self): # ----------------------------- """Set up Dictionary of valid attributes, their corresponding Type; S(tring), N(umeric) D(ata variable type) and Use C(oordinate), D(ata non-coordinate) or G(lobal) variable.""" self.AttrList = {} self.AttrList['add_offset'] = ['N', 'D'] self.AttrList['ancillary_variables'] = ['S', 'D'] self.AttrList['axis'] = ['S', 'C'] self.AttrList['bounds'] = ['S', 'C'] self.AttrList['calendar'] = ['S', 'C'] self.AttrList['cell_measures'] = ['S', 'D'] self.AttrList['cell_methods'] = ['S', 'D'] self.AttrList['climatology'] = ['S', 'C'] self.AttrList['comment'] = ['S', ('G', 'D')] self.AttrList['compress'] = ['S', 'C'] self.AttrList['Conventions'] = ['S', 'G'] self.AttrList['coordinates'] = ['S', 'D'] self.AttrList['_FillValue'] = ['D', 'D'] self.AttrList['flag_meanings'] = ['S', 'D'] self.AttrList['flag_values'] = ['D', 'D'] self.AttrList['formula_terms'] = ['S', 'C'] self.AttrList['grid_mapping'] = ['S', 'D'] self.AttrList['history'] = ['S', 'G'] self.AttrList['institution'] = ['S', ('G', 'D')] self.AttrList['leap_month'] = ['N', 'C'] self.AttrList['leap_year'] = ['N', 'C'] self.AttrList['long_name'] = ['S', ('C', 'D')] self.AttrList['missing_value'] = ['D', 'D'] self.AttrList['month_lengths'] = ['N', 'C'] self.AttrList['positive'] = ['S', 'C'] self.AttrList['references'] = ['S', ('G', 'D')] self.AttrList['scale_factor'] = ['N', 'D'] self.AttrList['source'] = ['S', ('G', 'D')] self.AttrList['standard_error_multiplier'] = ['N', 'D'] self.AttrList['standard_name'] = ['S', ('C', 'D')] self.AttrList['title'] = ['S', 'G'] self.AttrList['units'] = ['S', ('C', 'D')] self.AttrList['valid_max'] = ['N', ('C', 'D')] self.AttrList['valid_min'] = ['N', ('C', 'D')] self.AttrList['valid_range'] = ['N', ('C', 'D')] if self.version >= vn1_3: self.AttrList['flag_masks'] = ['D', 'D'] if self.version >= vn1_6: self.AttrList['cf_role'] = ['S', 'C'] self.AttrList['featureType'] = ['S', 'G'] self.AttrList['instance_dimension'] = ['S', 'D'] self.AttrList['sample_dimension'] = ['S', 'D'] # --------------------------- def uniqueList(self, lst): # --------------------------- """Determine if list has any repeated elements.""" # Rewrite to allow list to be either a list or a Numeric array seen = [] for x in lst: if x in seen: return 0 else: seen.append(x) return 1 # ------------------------- def isNumeric(self, var): # ------------------------- """Determine if variable is of Numeric data type.""" types = ['i', 'f', 'd'] rc = 1 if self.getTypeCode(self.f[var]) not in types: rc = 0 return rc # ------------------------- def getStdNameOld(self, var): # ------------------------- """Get standard_name of variable (i.e. just first part of standard_name attribute, without modifier)""" attName = 'standard_name' attDict = var.attributes if attName not in attDict.keys(): return None bits = attDict[attName].split() if bits: return bits[0] return "" # ------------------------- def getStdName(self, var): # ------------------------- """Get standard_name of variable. Return it as 2 parts - the standard name and the modifier, if present.""" attName = 'standard_name' attDict = var.attributes if attName not in attDict.keys(): return None bits = attDict[attName].split() if len(bits) == 1: # Only standard_name part present return (bits[0], "") if not bits: # Standard Name is blank return ("", "") # At least 2 elements so return the first 2. # If there are more than 2, which is invalid syntax, this will have been picked up by chkDescription() return (bits[0], bits[1]) # -------------------------------------------------- def getInterpretation(self, units, positive=None): # -------------------------------------------------- """Determine the interpretation (time - T, height or depth - Z, latitude - Y or longitude - X) of a dimension.""" if units in ['level', 'layer', 'sigma_level']: # Dimensionless vertical coordinate return "Z" # Parse the string representation of units into its binary representation for use by udunits binaryUnit = udunits.ut_parse(self.unitSystem, units, "UT_ASCII") if not binaryUnit: # Don't print this message out o/w it is repeated for every variable # that has this dimension. CRM033 return "None" instead # print "ERROR: Invalid units:",units # self.err = self.err+1 return None # print "here" # Time Coordinate # 19.08.10 - Workaround since udunits2 deems a unit without reference time not convertible to a # unit with reference time and vice versa if udunits.ut_are_convertible(binaryUnit, udunits.ut_parse(self.unitSystem, "second", "UT_ASCII")): return "T" elif udunits.ut_are_convertible(binaryUnit, udunits.ut_parse(self.unitSystem, "seconds since 1-1-1 0:0:0", "UT_ASCII")): return "T" # Vertical Coordinate if positive and re.match('(up|down)', positive, re.I): return "Z" # Variable is a vertical coordinate if the units are dimensionally # equivalent to Pressure if udunits.ut_are_convertible(binaryUnit, udunits.ut_parse(self.unitSystem, "Pa", "UT_ASCII")): return "Z" # Latitude Coordinate if re.match('(degrees_north|degree_north|degrees_N|degree_N|degreesN|degreeN)', units): return "Y" # Longitude Coordinate if re.match('(degrees_east|degree_east|degrees_E|degree_E|degreesE|degreeE)', units): return "X" # Not possible to deduce interpretation return None # -------------------------------- def getCoordinateDataVars(self): # -------------------------------- """Obtain list of coordinate data variables, boundary variables, climatology variables and grid_mapping variables.""" variables = self.f.variables.keys() # List of variables, but doesn't include coord vars allVariables = self.f._file_.variables.keys() # List of all vars, including coord vars axes = self.f.axes.keys() coordVars = [] boundaryVars = [] climatologyVars = [] gridMappingVars = [] auxCoordVars = [] for var in allVariables: if var not in variables: # Coordinate variable - 1D & dimension is the same name as the variable coordVars.append(var) # Commented out 21.02.06 - Duplicate code also in method chkDimensions # Probably can be completely removed. # if var not in coordVars: # Non-coordinate variable so check if it has any repeated dimensions # dimensions=self.f[var].getAxisIds() # dimensions.sort() # if not self.uniqueList(dimensions): # print "ERROR: variable has repeated dimensions" # self.err = self.err+1 # ------------------------ # Auxiliary Coord Checks # ------------------------ if 'coordinates' in self.f[var].attributes: # Check syntax of 'coordinates' attribute if not self.parseBlankSeparatedList(self.f[var].attributes['coordinates']): print("ERROR (5): Invalid syntax for 'coordinates' attribute in", var) self.err = self.err + 1 else: coordinates = self.f[var].attributes['coordinates'].split() for dataVar in coordinates: if dataVar in variables: # Has Auxiliary Coordinate already been identified and checked? if dataVar not in auxCoordVars: auxCoordVars.append(dataVar) # Is the auxiliary coordinate var actually a label? if self.getTypeCode(self.f[dataVar]) == 'c': # Label variable num_dimensions = len(self.f[dataVar].getAxisIds()) if self.version < vn1_4: if not num_dimensions == 2: print("ERROR (6.1): Label variable", dataVar, "must have 2 dimensions only") self.err = self.err + 1 if self.version >= vn1_4: if num_dimensions != 1 and num_dimensions != 2: print("ERROR (6.1): Label variable", dataVar, "must have 1 or 2 dimensions, but has", num_dimensions) self.err = self.err + 1 if num_dimensions == 2: if self.f[dataVar].getAxisIds()[0] not in self.f[var].getAxisIds(): if self.version >= vn1_6 and 'featureType' in self.f.attributes: # This file contains Discrete Sampling Geometries print("INFO (6.1): File contains a Discrete Sampling Geometry. Skipping check on dimensions of", dataVar) self.info = self.info + 1 else: print("ERROR (6.1): Leading dimension of", dataVar, "must match one of those for", var) self.err = self.err + 1 else: # Not a label variable # 31.05.13 The other exception is a ragged array (chapter 9 - Discrete sampling geometries # Todo - implement exception # A ragged array is identified by the presence of either the attribute sample_dimension # or instance_dimension. Need to check that the sample dimension is the dimension of # the variable to which the aux coord var is attached. # print dataVar,"- Not a label variable. Dimensions are:",self.f[dataVar].getAxisIds() # print var,"dimensions are:",self.f[var].getAxisIds() for dim in self.f[dataVar].getAxisIds(): if dim not in self.f[var].getAxisIds(): if self.version >= vn1_6 and 'featureType' in self.f.attributes: # This file contains Discrete Sampling Geometries print("INFO (5): File contains a Discrete Sampling Geometry. Skipping check on dimensions of", dataVar) self.info = self.info + 1 else: print("ERROR (5): Dimensions of", dataVar, "must be a subset of dimensions of", var) self.err = self.err + 1 break elif dataVar not in allVariables: print("ERROR (5): coordinates attribute referencing non-existent variable:", dataVar) self.err = self.err + 1 # ------------------------- # Boundary Variable Checks # ------------------------- if 'bounds' in self.f[var].attributes: bounds = self.f[var].attributes['bounds'] # Check syntax of 'bounds' attribute if not re.search("^[a-zA-Z0-9_]*$", bounds): print("ERROR (7.1): Invalid syntax for 'bounds' attribute") self.err = self.err + 1 else: if bounds in variables: boundaryVars.append(bounds) if not self.isNumeric(bounds): print("ERROR (7.1): boundary variable with non-numeric data type") self.err = self.err + 1 if len(self.f[var].shape) + 1 == len(self.f[bounds].shape): if var in axes: varDimensions = [var] else: varDimensions = self.f[var].getAxisIds() for dim in varDimensions: if dim not in self.f[bounds].getAxisIds(): print("ERROR (7.1): Incorrect dimensions for boundary variable:", bounds) self.err = self.err + 1 else: print("ERROR (7.1): Incorrect number of dimensions for boundary variable:", bounds) self.err = self.err + 1 if 'units' in self.f[bounds].attributes: if self.f[bounds].attributes['units'] != self.f[var].attributes['units']: print("ERROR (7.1): Boundary var", bounds, "has inconsistent units to", var) self.err = self.err + 1 if 'standard_name' in self.f[bounds].attributes and 'standard_name' in self.f[var].attributes: if self.f[bounds].attributes['standard_name'] != self.f[var].attributes['standard_name']: print("ERROR (7.1): Boundary var", bounds, "has inconsistent std_name to", var) self.err = self.err + 1 else: print("ERROR (7.1): bounds attribute referencing non-existent variable:", bounds) self.err = self.err + 1 # Check that points specified by a coordinate or auxiliary coordinate # variable should lie within, or on the boundary, of the cells specified by # the associated boundary variable. if bounds in variables: # Is boundary variable 2 dimensional? If so can check that points # lie within, or on the boundary. if len(self.f[bounds].getAxisIds()) <= 2: varData = self.f[var].getValue() boundsData = self.f[bounds].getValue() try: length = len(varData) except TypeError: length = 1 # scalar (no len); treat as length 1 if length == 0: print("WARNING: Problem with variable: '" + var + "' - Skipping check that data lies within cell boundaries.") self.warn = self.warn + 1 elif length == 1: # Gone for belts and braces approach here!! # Variable contains only one value # Bounds array will be 1 dimensional if not ((varData <= boundsData[0] and varData >= boundsData[1]) or (varData >= boundsData[0] and varData <= boundsData[1])): print("WARNING (7.1): Data for variable", var, "lies outside cell boundaries") self.warn = self.warn + 1 else: i = 0 for value in varData: if not ((value <= boundsData[i][0] and value >= boundsData[i][1]) or (value >= boundsData[i][0] and value <= boundsData[i][1])): print("WARNING (7.1): Data for variable", var, "lies outside cell boundaries") self.warn = self.warn + 1 break i = i + 1 # ---------------------------- # Climatology Variable Checks # ---------------------------- if 'climatology' in self.f[var].attributes: climatology = self.f[var].attributes['climatology'] # Check syntax of 'climatology' attribute if not re.search("^[a-zA-Z0-9_]*$", climatology): print("ERROR (7.4): Invalid syntax for 'climatology' attribute") self.err = self.err + 1 else: if climatology in variables: climatologyVars.append(climatology) if not self.isNumeric(climatology): print("ERROR (7.4): climatology variable with non-numeric data type") self.err = self.err + 1 if 'units' in self.f[climatology].attributes: if self.f[climatology].attributes['units'] != self.f[var].attributes['units']: print("ERROR (7.4): Climatology var", climatology, "has inconsistent units to", var) self.err = self.err + 1 if 'standard_name' in self.f[climatology].attributes: if self.f[climatology].attributes['standard_name'] != self.f[var].attributes['standard_name']: print("ERROR (7.4): Climatology var", climatology, "has inconsistent std_name to", var) self.err = self.err + 1 if 'calendar' in self.f[climatology].attributes: if self.f[climatology].attributes['calendar'] != self.f[var].attributes['calendar']: print("ERROR (7.4): Climatology var", climatology, "has inconsistent calendar to", var) self.err = self.err + 1 else: print("ERROR (7.4): climatology attribute referencing non-existent variable") self.err = self.err + 1 # ------------------------------------------ # Is there a grid_mapping variable? # ------------------------------------------ if 'grid_mapping' in self.f[var].attributes: grid_mapping = self.f[var].attributes['grid_mapping'] # Check syntax of grid_mapping attribute: a string whose value is a single variable name. if not re.search("^[a-zA-Z0-9_]*$", grid_mapping): print("ERROR (5.6):", var, "- Invalid syntax for 'grid_mapping' attribute") self.err = self.err + 1 else: if grid_mapping in variables: gridMappingVars.append(grid_mapping) else: print("ERROR (5.6): grid_mapping attribute referencing non-existent variable", grid_mapping) self.err = self.err + 1 return (coordVars, auxCoordVars, boundaryVars, climatologyVars, gridMappingVars) # ------------------------------------- def chkGridMappingVar(self, varName): # ------------------------------------- """Section 5.6: Grid Mapping Variable Checks""" rc = 1 var = self.f[varName] if 'grid_mapping_name' in var.attributes: # Check grid_mapping_name is valid validNames = ['albers_conical_equal_area', 'azimuthal_equidistant', 'lambert_azimuthal_equal_area', 'lambert_conformal_conic', 'polar_stereographic', 'rotated_latitude_longitude', 'stereographic', 'transverse_mercator'] validNames += ['geostationary'] # GDAL addition if self.version >= vn1_2: # Extra grid_mapping_names at vn1.2 validNames[len(validNames):] = ['latitude_longitude', 'vertical_perspective'] if self.version >= vn1_4: # Extra grid_mapping_names at vn1.4 validNames[len(validNames):] = ['lambert_cylindrical_equal_area', 'mercator', 'orthographic'] if var.grid_mapping_name not in validNames: print("ERROR (5.6): Invalid grid_mapping_name:", var.grid_mapping_name) self.err = self.err + 1 rc = 0 else: print("ERROR (5.6): No grid_mapping_name attribute set") self.err = self.err + 1 rc = 0 if var.getAxisIds(): print("WARNING (5.6): A grid mapping variable should have 0 dimensions") self.warn = self.warn + 1 return rc # ------------------------ def setUpFormulas(self): # ------------------------ """Set up dictionary of all valid formulas""" self.formulas = {} self.alias = {} self.alias['atmosphere_ln_pressure_coordinate'] = 'atmosphere_ln_pressure_coordinate' self.alias['atmosphere_sigma_coordinate'] = 'sigma' self.alias['sigma'] = 'sigma' self.alias['atmosphere_hybrid_sigma_pressure_coordinate'] = 'hybrid_sigma_pressure' self.alias['hybrid_sigma_pressure'] = 'hybrid_sigma_pressure' self.alias['atmosphere_hybrid_height_coordinate'] = 'atmosphere_hybrid_height_coordinate' self.alias['ocean_sigma_coordinate'] = 'ocean_sigma_coordinate' self.alias['ocean_s_coordinate'] = 'ocean_s_coordinate' self.alias['ocean_sigma_z_coordinate'] = 'ocean_sigma_z_coordinate' self.alias['ocean_double_sigma_coordinate'] = 'ocean_double_sigma_coordinate' self.formulas['atmosphere_ln_pressure_coordinate'] = ['p(k)=p0*exp(-lev(k))'] self.formulas['sigma'] = ['p(n,k,j,i)=ptop+sigma(k)*(ps(n,j,i)-ptop)'] self.formulas['hybrid_sigma_pressure'] = ['p(n,k,j,i)=a(k)*p0+b(k)*ps(n,j,i)', 'p(n,k,j,i)=ap(k)+b(k)*ps(n,j,i)'] self.formulas['atmosphere_hybrid_height_coordinate'] = ['z(n,k,j,i)=a(k)+b(k)*orog(n,j,i)'] self.formulas['ocean_sigma_coordinate'] = ['z(n,k,j,i)=eta(n,j,i)+sigma(k)*(depth(j,i)+eta(n,j,i))'] self.formulas['ocean_s_coordinate'] = ['z(n,k,j,i)=eta(n,j,i)*(1+s(k))+depth_c*s(k)+(depth(j,i)-depth_c)*C(k)', 'C(k)=(1-b)*sinh(a*s(k))/sinh(a)+b*[tanh(a*(s(k)+0.5))/(2*tanh(0.5*a))-0.5]'] self.formulas['ocean_sigma_z_coordinate'] = ['z(n,k,j,i)=eta(n,j,i)+sigma(k)*(min(depth_c,depth(j,i))+eta(n,j,i))', 'z(n,k,j,i)=zlev(k)'] self.formulas['ocean_double_sigma_coordinate'] = ['z(k,j,i)=sigma(k)*f(j,i)', 'z(k,j,i)=f(j,i)+(sigma(k)-1)*(depth(j,i)-f(j,i))', 'f(j,i)=0.5*(z1+z2)+0.5*(z1-z2)*tanh(2*a/(z1-z2)*(depth(j,i)-href))'] # ---------------------------------------- def parseBlankSeparatedList(self, lst): # ---------------------------------------- """Parse blank separated list""" if re.match("^[a-zA-Z0-9_ ]*$", lst): return 1 return 0 # ------------------------------------------- def extendedBlankSeparatedList(self, lst): # ------------------------------------------- """Check list is a blank separated list of words containing alphanumeric characters plus underscore '_', period '.', plus '+', hyphen '-', or "at" sign '@'.""" if re.match("^[a-zA-Z0-9_ @\-\+\.]*$", lst): return 1 return 0 # ------------------------------------------- def commaOrBlankSeparatedList(self, lst): # ------------------------------------------- """Check list is a blank or comma separated list of words containing alphanumeric characters plus underscore '_', period '.', plus '+', hyphen '-', or "at" sign '@'.""" if re.match("^[a-zA-Z0-9_ @\-\+\.,]*$", lst): return 1 return 0 # ------------------------------ def chkGlobalAttributes(self): # ------------------------------ """Check validity of global attributes.""" rc = 1 if 'Conventions' in self.f.attributes: conventions = self.f.attributes['Conventions'] # Conventions attribute can be a blank separated (or comma separated) list of conforming conventions if not self.commaOrBlankSeparatedList(conventions): print("ERROR(2.6.1): Conventions attribute must be a blank (or comma) separated list of convention names") self.err = self.err + 1 rc = 0 else: # Split string up into component parts # If a comma is present we assume a comma separated list as names cannot contain commas if re.match("^.*,.*$", conventions): conventionList = conventions.split(",") else: conventionList = conventions.split() found = 0 for convention in conventionList: if convention.strip() in map(str, cfVersions): found = 1 break if found != 1: print("ERROR (2.6.1): This netCDF file does not appear to contain CF Convention data.") self.err = self.err + 1 rc = 0 else: if convention.strip() != str(self.version): print("WARNING: Inconsistency - This netCDF file appears to contain " + convention + " data, but you've requested a validity check against %s" % self.version) self.warn = self.warn + 1 else: print("WARNING (2.6.1): No 'Conventions' attribute present") self.warn = self.warn + 1 rc = 1 # Discrete geometries if self.version >= vn1_6 and 'featureType' in self.f.attributes: featureType = self.f.attributes['featureType'] if not re.match('^(point|timeSeries|trajectory|profile|timeSeriesProfile|trajectoryProfile)$', featureType, re.I): print("ERROR (9.4): Global attribute 'featureType' contains invalid value") # self.chkFeatureType() for attribute in ['title', 'history', 'institution', 'source', 'reference', 'comment']: if attribute in self.f.attributes: if not isinstance(self.f.attributes[attribute], str): print("ERROR (2.6.2): Global attribute", attribute, "must be of type 'String'") self.err = self.err + 1 return rc # ------------------------------ def getFileCFVersion(self): # ------------------------------ """Return CF version of file, used for auto version option. If Conventions is COARDS return CF-1.0, else a valid version based on Conventions else an empty version (for auto version)""" rc = CFVersion() if 'Conventions' in self.f.attributes: conventions = self.f.attributes['Conventions'] # Split string up into component parts # If a comma is present we assume a comma separated list as names cannot contain commas if re.match("^.*,.*$", conventions): conventionList = conventions.split(",") else: conventionList = conventions.split() found = 0 coards = 0 for convention in conventionList: if convention.strip() in map(str, cfVersions): found = 1 rc = CFVersion(convention.strip()) break elif convention.strip() == 'COARDS': coards = 1 if not found and coards: print("WARNING: The conventions attribute specifies COARDS, assuming CF-1.0") rc = CFVersion((1, 0)) return rc # -------------------------- def validName(self, name): # -------------------------- """ Check for valid name. They must begin with a letter and be composed of letters, digits and underscores.""" nameSyntax = re.compile('^[a-zA-Z][a-zA-Z0-9_]*$') if not nameSyntax.match(name): return 0 return 1 # --------------------------------------------- def chkDimensions(self, varName, allcoordVars): # --------------------------------------------- """Check variable has non-repeated dimensions, that space/time dimensions are listed in the order T,Z,Y,X and that any non space/time dimensions are added to the left of the space/time dimensions, unless it is a boundary variable or climatology variable, where 1 trailing dimension is allowed.""" var = self.f[varName] dimensions = var.getAxisIds() trailingVars = [] if len(dimensions) > 1: order = ['T', 'Z', 'Y', 'X'] axesFound = [0, 0, 0, 0] # Holding array to record whether a dimension with an axis value has been found. i = -1 lastPos = -1 # trailing=0 # Flag to indicate trailing dimension # Flags to hold positions of first space/time dimension and # last Non-space/time dimension in variable declaration. firstST = -1 lastNonST = -1 nonSpaceDimensions = [] for dim in dimensions: i = i + 1 try: if hasattr(self.f[dim], 'axis'): pos = order.index(self.f[dim].axis) # Is there already a dimension with this axis attribute specified. if axesFound[pos] == 1: print("ERROR (4): Variable has more than 1 coordinate variable with same axis value") self.err = self.err + 1 else: axesFound[pos] = 1 elif hasattr(self.f[dim], 'units') and self.f[dim].units != "": # Determine interpretation of variable by units attribute if hasattr(self.f[dim], 'positive'): interp = self.getInterpretation(self.f[dim].units, self.f[dim].positive) else: interp = self.getInterpretation(self.f[dim].units) if not interp: raise ValueError pos = order.index(interp) else: # No axis or units attribute so can't determine interpretation of variable raise ValueError if firstST == -1: firstST = pos except AttributeError: print("ERROR: Problem accessing variable:", dim, "(May not exist in file).") self.err = self.err + 1 exit(self.err) except ValueError: # Dimension is not T,Z,Y or X axis nonSpaceDimensions.append(dim) trailingVars.append(dim) lastNonST = i else: # Is the dimensional position of this dimension further to the right than the previous dim? if pos >= lastPos: lastPos = pos trailingVars = [] else: print("WARNING (2.4): space/time dimensions appear in incorrect order") self.warn = self.warn + 1 # As per CRM #022 # This check should only be applied for COARDS conformance. if self.coards: validTrailing = self.boundsVars[:] validTrailing[len(validTrailing):] = self.climatologyVars[:] if lastNonST > firstST and firstST != -1: if len(trailingVars) == 1: if var.id not in validTrailing: print("WARNING (2.4): dimensions", nonSpaceDimensions, "should appear to left of space/time dimensions") self.warn = self.warn + 1 else: print("WARNING (2.4): dimensions", nonSpaceDimensions, "should appear to left of space/time dimensions") self.warn = self.warn + 1 dimensions.sort() if not self.uniqueList(dimensions): print("ERROR (2.4): variable has repeated dimensions") self.err = self.err + 1 # Removed this check as per emails 11 June 2004 (See CRM #020) # Check all dimensions of data variables have associated coordinate variables # for dim in dimensions: # if dim not in f._file_.variables.keys() or dim not in allcoordVars: # if dim not in trailingVars: # dim is not a valid trailing dimension. (valid trailing dimensions e.g. for bounds # vars; do not need to have an associated coordinate variable CF doc 7.1) # print "WARNING: Dimension:",dim,"does not have an associated coordinate variable" # self.warn = self.warn+1 # ------------------------------------------------------- def getTypeCode(self, obj): # ------------------------------------------------------- """ Get the type, as a 1-character code, of an object that may be a CDMS FileAxis, a CDMS FileVariable, or a numpy.ndarray """ # A previous comment in the code claimed: # # # 26.02.10 - CDAT-5.2 - An inconsistency means that determining the type of # # a FileAxis or FileVariable is different. C.Doutriaux will hopefully # # make this more uniform (Raised on the cdat mailing list) CF Trac # # # in fact it seems that both cdms.axis.FileAxis and cdms.fvariable.FileVariable # support obj.typecode() (although the FileVariable also supports obj.dtype.char, # so obj.typecode() will work for both of these. However, numpy.ndarray only # supports obj.dtype.char if isinstance(obj, numpy.ndarray): return obj.dtype.char return obj.typecode() # ------------------------------------------------------- def chkAttribute(self, attribute, varName, allCoordVars): # ------------------------------------------------------- """Check the syntax of the attribute name, that the attribute is of the correct type and that it is attached to the right kind of variable.""" rc = 1 var = self.f[varName] if not self.validName(attribute) and attribute != "_FillValue": print("ERROR: Invalid attribute name -", attribute) self.err = self.err + 1 return 0 value = var.attributes[attribute] # ------------------------------------------------------------ # Attribute of wrong 'type' in the sense numeric/non-numeric # ------------------------------------------------------------ if attribute in self.AttrList: # Standard Attribute, therefore check type attrType = type(value) if isinstance(value, str): attrType = 'S' elif isinstance(value, (int, float)): attrType = 'N' elif isinstance(value, numpy.ndarray): attrType = 'N' elif isinstance(value, type(None)): # attrType=self.AttrList[attribute][0] attrType = 'NoneType' else: print("Unknown Type for attribute:", attribute, attrType) # If attrType = 'NoneType' then it has been automatically created e.g. missing_value typeError = 0 if attrType != 'NoneType': if self.AttrList[attribute][0] == 'D': # Special case for 'D' as these attributes will always be caught # by one of the above cases. # Attributes of type 'D' should be the same type as the data variable # they are attached to. if attrType == 'S': # Note: A string is an array of chars if self.getTypeCode(var) != 'c': typeError = 1 else: if self.getTypeCode(var) != self.getTypeCode(var.attributes[attribute]): typeError = 1 elif self.AttrList[attribute][0] != attrType: typeError = 1 if typeError: print("ERROR: Attribute", attribute, "of incorrect type") self.err = self.err + 1 rc = 0 # Attribute attached to the wrong kind of variable uses = self.AttrList[attribute][1] usesLen = len(uses) i = 1 for use in uses: if use == "C" and var.id in allCoordVars: # Valid association break elif use == "D" and var.id not in allCoordVars: # Valid association break elif i == usesLen: if attribute == "missing_value": # Special case since missing_value attribute is present for all # variables whether set explicitly or not. Is this a cdms thing? # Using var.missing_value is null then missing_value not set in the file if var.missing_value: print("WARNING: attribute", attribute, "attached to wrong kind of variable") self.warn = self.warn + 1 else: print("INFO: attribute '" + attribute + "' is being used in a non-standard way") self.info = self.info + 1 else: i = i + 1 # Check no time variable attributes. E.g. calendar, month_lengths etc. TimeAttributes = ['calendar', 'month_lengths', 'leap_year', 'leap_month', 'climatology'] if attribute in TimeAttributes: if 'units' in var.attributes: varUnits = udunits.ut_parse(self.unitSystem, var.attributes['units'], "UT_ASCII") secsSinceEpoch = udunits.ut_parse(self.unitSystem, "seconds since 1970-01-01", "UT_ASCII") if not udunits.ut_are_convertible(varUnits, secsSinceEpoch): print("ERROR (4.4.1): Attribute", attribute, "may only be attached to time coordinate variable") self.err = self.err + 1 rc = 0 # Free up resources associated with varUnits udunits.ut_free(varUnits) udunits.ut_free(secsSinceEpoch) else: print("ERROR (4.4.1): Attribute", attribute, "may only be attached to time coordinate variable") self.err = self.err + 1 rc = 0 return rc # ---------------------------------- def chkCellMethods(self, varName): # ---------------------------------- """Checks on cell_methods attribute 1) Correct syntax 2) Valid methods 3) Valid names 4) No duplicate entries for dimension other than 'time'""" # dim1: [dim2: [dim3: ...]] method [ (comment) ] # where comment is of the form: ([interval: value unit [interval: ...] comment:] remainder) rc = 1 error = 0 # Flag to indicate validity of cell_methods string syntax varDimensions = {} var = self.f[varName] if 'cell_methods' in var.attributes: cellMethods = var.attributes['cell_methods'] getComments = re.compile(r'\([^)]+\)') # Remove comments from the cell_methods string and split at these points noComments = getComments.sub('%5A', cellMethods) substrings = re.split('%5A', noComments) pr = re.compile(r'^\s*(\S+\s*:\s*(\S+\s*:\s*)*(point|sum|maximum|median|mid_range|minimum|mean|mode|standard_deviation|variance)(\s+(over|within)\s+(days|years))?\s*)+$') # Validate each substring for s in substrings: if s: if not pr.match(s): strError = s error = 1 break # Validate dim and check that it only appears once unless it is 'time' allDims = re.findall(r'\S+\s*:', s) for part in allDims: dims = re.split(':', part) for d in dims: if d: if var.getAxisIndex(d) == -1 and d not in self.std_name_dh.dict.keys(): print("ERROR (7.3): Invalid 'name' in cell_methods attribute:", d) self.err = self.err + 1 rc = 0 elif d in varDimensions and d != "time": print("ERROR (7.3): Multiple cell_methods entries for dimension:", d) self.err = self.err + 1 else: varDimensions[d] = 1 # Validate the comment if it is standardized # RSH TO DO: Still need to implement validation of unit in the standardized comment. if not error: comments = getComments.findall(cellMethods) cpr = re.compile(r'^\((interval:\s+\d+\s+(years|months|days|hours|minutes|seconds)\s*)*(comment: .+)?\)') for c in comments: if re.search(r'^\(\s*interval', c): # Only need to check standardized comments i.e. those beginning (interval ...) if not cpr.match(c): strError = c error = 1 break if error: print("ERROR (7.3): Invalid cell_methods syntax: '" + strError + "'") self.err = self.err + 1 rc = 0 return rc # ---------------------------- def chkCFRole(self, varName): # ---------------------------- # Validate cf_role attribute rc = 1 var = self.f[varName] if 'cf_role' in var.attributes: cf_role = var.attributes['cf_role'] # Keep a tally of how many variables have the cf_role attribute set # print "ROS: Attribute cf_role found!!" self.cf_roleCount = self.cf_roleCount + 1 if cf_role not in ['timeseries_id', 'profile_id', 'trajectory_id']: print("ERROR (9.5): Invalid value for cf_role attribute") self.err = self.err + 1 rc = 0 return rc # --------------------------------- def chkRaggedArray(self, varName): # --------------------------------- # Validate count/index variable # rc=1 var = self.f[varName] if 'sample_dimension' in var.attributes: # print varName," is a count variable (Discrete Geometries)" self.raggedArrayFlag = 1 if self.getTypeCode(var) != 'i': print("ERROR (9.3): count variable '" + varName + "' must be of type integer") self.err = self.err + 1 if 'instance_dimension' in var.attributes: # print varName," is an index variable (Discrete Geometries)" self.raggedArrayFlag = 1 if self.getTypeCode(var) != 'i': print("ERROR (9.3): index variable '" + varName + "' must be of type integer") self.err = self.err + 1 # ---------------------------------- def isValidUdunitsUnit(self, unit): # ---------------------------------- # units must be recognizable by udunits package udunitsUnit = udunits.ut_parse(self.unitSystem, unit, "UT_ASCII") if udunitsUnit: # Valid unit rc = 1 else: # Invalid unit rc = 0 # Free up resources associated with udunitsUnit udunits.ut_free(udunitsUnit) return rc # --------------------------------------------------- def isValidCellMethodTypeValue(self, typ, value): # --------------------------------------------------- """ Is or in the cell_methods attribute a valid value""" rc = 1 # Is it a string-valued aux coord var with standard_name of area_type? if value in self.auxCoordVars: if self.getTypeCode(self.f[value]) != 'c': rc = 0 elif typ == "type2": # has the additional requirement that it is not allowed a leading dimension of more than one leadingDim = self.f[value].getAxisIds()[0] # Must not be a value of more than one if self.f.dimensions[leadingDim] > 1: print("ERROR (7.3):", value, "is not allowed a leading dimension of more than one.") self.err = self.err + 1 if 'standard_name' in self.f[value].attributes: if self.f[value].attributes['standard_name'] != 'area_type': rc = 0 # Is type a valid area_type according to the area_type table elif value not in self.area_type_lh.list: rc = 0 return rc # ---------------------------------- def chkCellMethods_redefined(self, varName): # ---------------------------------- """Checks on cell_methods attribute dim1: [dim2: [dim3: ...]] method [where type1 [over type2]] [ (comment) ] where comment is of the form: ([interval: value unit [interval: ...] comment:] remainder) """ rc = 1 # error = 0 # Flag to indicate validity of cell_methods string syntax varDimensions = {} var = self.f[varName] if 'cell_methods' in var.attributes: cellMethods = var.attributes['cell_methods'] # cellMethods="lat: area: maximum (interval: 1 hours interval: 3 hours comment: fred)" pr1 = re.compile(r'^' r'(\s*\S+\s*:\s*(\S+\s*:\s*)*' r'([a-z_]+)' r'(\s+where\s+\S+(\s+over\s+\S+)?)?' r'(\s+(over|within)\s+(days|years))?\s*' r'(\((interval:\s+\d+\s+\S+\s*)*(comment: .+)?.*\))?)' r'+$') # Validate the entire string m = pr1.match(cellMethods) if not m: print("ERROR (7.3) Invalid syntax for cell_methods attribute") self.err = self.err + 1 rc = 0 # Grab each word-list - dim1: [dim2: [dim3: ...]] method [where type1 [over type2]] [within|over days|years] [(comment)] pr2 = re.compile(r'(?P\s*\S+\s*:\s*(\S+\s*:\s*)*' r'(?P[a-z_]+)' r'(?:\s+where\s+(?P\S+)(?:\s+over\s+(?P\S+))?)?' r'(?:\s+(?:over|within)\s+(?:days|years))?\s*)' r'(?P\([^)]+\))?') substr_iter = pr2.finditer(cellMethods) # Validate each substring for s in substr_iter: if not re.match(r'point|sum|maximum|median|mid_range|minimum|mean|mode|standard_deviation|variance', s.group('method')): print("ERROR (7.3): Invalid cell_method:", s.group('method')) self.err = self.err + 1 rc = 0 if self.version >= vn1_4: if s.group('type1'): if not self.isValidCellMethodTypeValue('type1', s.group('type1')): print("ERROR (7.3): Invalid type1: '" + s.group('type1') + "' - must be a variable name or valid area_type") self.err = self.err + 1 if s.group('type2'): if not self.isValidCellMethodTypeValue('type2', s.group('type2')): print("ERROR (7.3): Invalid type2: '" + s.group('type2') + "' - must be a variable name or valid area_type") self.err = self.err + 1 # Validate dim and check that it only appears once unless it is 'time' allDims = re.findall(r'\S+\s*:', s.group('dimensions')) dc = 0 # Number of dims for part in allDims: dims = re.split(':', part) for d in dims: if d: dc = dc + 1 if var.getAxisIndex(d) == -1 and d not in self.std_name_dh.dict.keys(): if self.version >= vn1_4: # Extra constraints at CF-1.4 and above if d != "area": print("ERROR (7.3): Invalid 'name' in cell_methods attribute:", d) self.err = self.err + 1 rc = 0 else: print("ERROR (7.3): Invalid 'name' in cell_methods attribute:", d) self.err = self.err + 1 rc = 0 else: # dim is a variable dimension if d in varDimensions and d != "time": print("ERROR (7.3): Multiple cell_methods entries for dimension:", d) self.err = self.err + 1 rc = 0 else: varDimensions[d] = 1 if self.version >= vn1_4: # If dim is a coordinate variable and cell_method is not 'point' check # if the coordinate variable has either bounds or climatology attributes if d in self.coordVars and s.group('method') != 'point': if 'bounds' not in self.f[d].attributes and 'climatology' not in self.f[d].attributes: print("WARNING (7.3): Coordinate variable", d, "should have bounds or climatology attribute") self.warn = self.warn + 1 # Validate the comment associated with this method, if present comment = s.group('comment') if comment: getIntervals = re.compile(r'(?Pinterval:\s+\d+\s+(?P\S+)\s*)') allIntervals = getIntervals.finditer(comment) # There must be zero, one or exactly as many interval clauses as there are dims i = 0 # Number of intervals present for m in allIntervals: i = i + 1 unit = m.group('unit') if not self.isValidUdunitsUnit(unit): print("ERROR (7.3): Invalid unit", unit, "in cell_methods comment") self.err = self.err + 1 rc = 0 if i > 1 and i != dc: print("ERROR (7.3): Incorrect number or interval clauses in cell_methods attribute") self.err = self.err + 1 rc = 0 return rc # ---------------------------------- def chkCellMeasures(self, varName): # ---------------------------------- """Checks on cell_measures attribute: 1) Correct syntax 2) Reference valid variable 3) Valid measure""" rc = 1 var = self.f[varName] if 'cell_measures' in var.attributes: cellMeasures = var.attributes['cell_measures'] if not re.search("^([a-zA-Z0-9]+: +([a-zA-Z0-9_ ]+:?)*( +[a-zA-Z0-9_]+)?)$", cellMeasures): print("ERROR (7.2): Invalid cell_measures syntax") self.err = self.err + 1 rc = 0 else: # Need to validate the measure + name split = cellMeasures.split() splitIter = iter(split) try: while 1: measure = splitIter.next() variable = splitIter.next() if variable not in self.f.variables.keys(): print("WARNING (7.2): cell_measures referring to variable '" + variable + "' that doesn't exist in this netCDF file.") print("INFO (7.2): This is strictly an error if the cell_measures variable is not included in the dataset.") self.warn = self.warn + 1 rc = 0 else: # Valid variable name in cell_measures so carry on with tests. if len(self.f[variable].getAxisIds()) > len(var.getAxisIds()): print("ERROR (7.2): Dimensions of", variable, "must be same or a subset of", var.getAxisIds()) self.err = self.err + 1 rc = 0 else: # If cell_measures variable has more dims than var then this check automatically will fail # Put in else so as not to duplicate ERROR messages. for dim in self.f[variable].getAxisIds(): if dim not in var.getAxisIds(): print("ERROR (7.2): Dimensions of", variable, "must be same or a subset of", var.getAxisIds()) self.err = self.err + 1 rc = 0 measure = re.sub(':', '', measure) if not re.match("^(area|volume)$", measure): print("ERROR (7.2): Invalid measure in attribute cell_measures") self.err = self.err + 1 rc = 0 if measure == "area" and self.f[variable].units != "m2": print("ERROR (7.2): Must have square meters for area measure") self.err = self.err + 1 rc = 0 if measure == "volume" and self.f[variable].units != "m3": print("ERROR (7.2): Must have cubic meters for volume measure") self.err = self.err + 1 rc = 0 except StopIteration: pass return rc # ---------------------------------- def chkFormulaTerms(self, varName, allCoordVars): # ---------------------------------- """Checks on formula_terms attribute (CF Section 4.3.2): formula_terms = var: term var: term ... 1) No standard_name present 2) No formula defined for std_name 3) Invalid formula_terms syntax 4) Var referenced, not declared""" rc = 1 var = self.f[varName] if 'formula_terms' in var.attributes: if varName not in allCoordVars: print("ERROR (4.3.2): formula_terms attribute only allowed on coordinate variables") self.err = self.err + 1 # Get standard_name to determine which formula is to be used if 'standard_name' not in var.attributes: print("ERROR (4.3.2): Cannot get formula definition as no standard_name") self.err = self.err + 1 # No sense in carrying on as can't validate formula_terms without valid standard name return 0 (stdName, modifier) = self.getStdName(var) if stdName not in self.alias: print("ERROR (4.3.2): No formula defined for standard name:", stdName) self.err = self.err + 1 # No formula available so can't validate formula_terms return 0 index = self.alias[stdName] formulaTerms = var.attributes['formula_terms'] if not re.search("^([a-zA-Z0-9_]+: +[a-zA-Z0-9_]+( +)?)*$", formulaTerms): print("ERROR (4.3.2): Invalid formula_terms syntax") self.err = self.err + 1 rc = 0 else: # Need to validate the term & var split = formulaTerms.split() for x in split[:]: if not re.search("^[a-zA-Z0-9_]+:$", x): # Variable - should be declared in netCDF file if x not in self.f._file_.variables.keys(): print("ERROR (4.3.2):", x, "is not declared as a variable") self.err = self.err + 1 rc = 0 else: # Term - Should be present in formula x = re.sub(':', '', x) found = 'false' for formula in self.formulas[index]: if re.search(x, formula): found = 'true' break if found == 'false': print("ERROR (4.3.2): term", x, "not present in formula") self.err = self.err + 1 rc = 0 return rc # ---------------------------------------- def chkUnits(self, varName, allCoordVars): # ---------------------------------------- """Check units attribute""" rc = 1 var = self.f[varName] if self.badc: rc = self.chkBADCUnits(var) # If unit is a BADC unit then no need to check via udunits if rc: return rc # Test for blank since coordinate variables have 'units' defined even if not specifically defined in the file if 'units' in var.attributes and var.attributes['units'] != '': # Type of units is a string units = var.attributes['units'] if not isinstance(units, str): print("ERROR (3.1): units attribute must be of type 'String'") self.err = self.err + 1 # units not a string so no point carrying out further tests return 0 # units - level, layer and sigma_level are deprecated if units in ['level', 'layer', 'sigma_level']: print("WARNING (3.1): units", units, "is deprecated") self.warn = self.warn + 1 elif units == 'month': print("WARNING (4.4): The unit 'month', defined by udunits to be exactly year/12, should") print(" be used with caution.") self.warn = self.warn + 1 elif units == 'year': print("WARNING (4.4): The unit 'year', defined by udunits to be exactly 365.242198781 days,") print(" should be used with caution. It is not a calendar year.") else: # units must be recognizable by udunits package varUnit = udunits.ut_parse(self.unitSystem, units, "UT_ASCII") if not varUnit: print("ERROR (3.1): Invalid units: ", units) self.err = self.err + 1 # Invalid units so no point continuing with further unit checks return 0 # units of a variable that specifies a standard_name must # be consistent with units given in standard_name table if 'standard_name' in var.attributes: (stdName, modifier) = self.getStdName(var) # Is the Standard Name modifier number_of_observations being used. if modifier == 'number_of_observations': # Standard Name modifier is number_of_observations therefore units should be "1". See Appendix C if not units == "1": print("ERROR (3.3): Standard Name modifier 'number_of_observations' present therefore units must be set to 1.") self.err = self.err + 1 elif stdName in self.std_name_dh.dict.keys(): # Get canonical units from standard name table stdNameUnits = self.std_name_dh.dict[stdName] # stdNameUnits is unicode which udunits can't deal with. Explicitly convert it to ASCII stdNameUnits = stdNameUnits.encode('ascii') canonicalUnit = udunits.ut_parse(self.unitSystem, stdNameUnits, "UT_ASCII") # To compare units we need to remove the reference time from the variable units if re.search("since", units): # unit attribute contains a reference time - remove it udunits.ut_free(varUnit) varUnit = udunits.ut_parse(self.unitSystem, units.split()[0], "UT_ASCII") # If variable has cell_methods=variance we need to square standard_name table units if 'cell_methods' in var.attributes: # Remove comments from the cell_methods string - no need to search these getComments = re.compile(r'\([^)]+\)') noComments = getComments.sub('%5A', var.attributes['cell_methods']) if re.search(r'(\s+|:)variance', noComments): # Variance method so standard_name units need to be squared. unit1 = udunits.ut_parse(self.unitSystem, stdNameUnits, "UT_ASCII") canonicalUnit = udunits.ut_multiply(unit1, unit1) udunits.ut_free(unit1) if not udunits.ut_are_convertible(varUnit, canonicalUnit): # Conversion unsuccessful print("ERROR (3.1): Units are not consistent with those given in the standard_name table.") self.err = self.err + 1 rc = 0 # Free resources associated with canonicalUnit udunits.ut_free(canonicalUnit) # Free resources associated with udunitsUnit udunits.ut_free(varUnit) else: # No units attribute - is this a coordinate variable or # dimensionless vertical coordinate var if var.id in allCoordVars: # Label variables do not require units attribute if self.f[var.id].typecode() != 'c': if 'axis' in var.attributes: if not var.axis == 'Z': print("WARNING (3.1): units attribute should be present") self.warn = self.warn + 1 elif not hasattr(var, 'positive') and not hasattr(var, 'formula_terms') and not hasattr(var, 'compress'): print("WARNING (3.1): units attribute should be present") self.warn = self.warn + 1 elif var.id not in self.boundsVars and var.id not in self.climatologyVars and var.id not in self.gridMappingVars: # Variable is not a boundary or climatology variable dimensions = self.f[var.id].getAxisIds() if not hasattr(var, 'flag_values') and dimensions and self.f[var.id].typecode() != 'c': # Variable is not a flag variable or a scalar or a label print("INFO (3.1): No units attribute set. Please consider adding a units attribute for completeness.") self.info = self.info + 1 return rc # ---------------------------- def chkBADCUnits(self, var): # ---------------------------- """Check units allowed by BADC""" units_lines = open("/usr/local/cf-checker/lib/badc_units.txt").readlines() # badc_units test case # units_lines=open("/home/ros/SRCE_projects/CF_Checker_W/main/Test_Files/badc_units.txt").readlines() # units must be recognizable by the BADC units file for line in units_lines: if hasattr(var, 'units') and var.attributes['units'] in line.split(): print("Valid units in BADC list:", var.attributes['units']) rc = 1 break else: rc = 0 return rc # --------------------------------------- def chkValidMinMaxRange(self, varName): # --------------------------------------- """Check that valid_range and valid_min/valid_max are not both specified""" var = self.f[varName] if 'valid_range' in var.attributes: if 'valid_min' in var.attributes or \ 'valid_max' in var.attributes: print("ERROR (2.5.1): Illegal use of valid_range and valid_min/valid_max") self.err = self.err + 1 return 0 return 1 # --------------------------------- def chk_FillValue(self, varName): # --------------------------------- """Check 1) type of _FillValue 2) _FillValue lies outside of valid_range 3) type of missing_value 4) flag use of missing_value as deprecated""" rc = 1 var = self.f[varName] # varType = self.getTypeCode(var) if '_FillValue' in var.__dict__: fillValue = var.__dict__['_FillValue'] # 05.02.08 No longer needed as this is now detected by chkAttribute as _FillValue # has an attribute type of 'D'. See Trac #022 # if varType == 'c' or varType == types.StringType: # if type(fillValue) != types.StringType: # print "ERROR (2.5.1): _FillValue of different type to variable" # self.err = self.err+1 # rc=0 # elif varType != self.getTypeCode(fillValue): # print "ERROR (2.5.1): _FillValue of different type to variable" # self.err = self.err+1 # rc=0 if 'valid_range' in var.attributes: # Check _FillValue is outside valid_range validRange = var.attributes['valid_range'] if fillValue > validRange[0] and fillValue < validRange[1]: print("WARNING (2.5.1): _FillValue should be outside valid_range") self.warn = self.warn + 1 if var.id in self.boundsVars: print("WARNING (7.1): Boundary Variable", var.id, "should not have _FillValue attribute") self.warn = self.warn + 1 elif var.id in self.climatologyVars: print("ERROR (7.4): Climatology Variable", var.id, "must not have _FillValue attribute") self.err = self.err + 1 rc = 0 if 'missing_value' in var.attributes: missingValue = var.attributes['missing_value'] # print type(missingValue) # print type(Numeric.array([])) try: if missingValue: if '_FillValue' in var.__dict__: if fillValue != missingValue: # Special case: NaN == NaN is not detected as NaN does not compare equal to anything else if not (numpy.isnan(fillValue) and numpy.isnan(missingValue)): print("WARNING (2.5.1): missing_value and _FillValue set to differing values") self.warn = self.warn + 1 # 08.12.10 missing_value is no longer deprecated by the NUG # else: # _FillValue not present # print "WARNING (2.5.1): Use of 'missing_value' attribute is deprecated" # self.warn = self.warn+1 # 05.02.08 No longer needed as this is now detected by chkAttribute as missing_value # has an attribute type of 'D'. See Trac #022 # typeError = 0 # if varType == 'c': # if type(missingValue) != types.StringType: # typeError = 1 # elif varType != self.getTypeCode(missingValue): # typeError = 1 # # if typeError: # print "ERROR (2.5.1): missing_value of different type to variable" # self.err = self.err+1 # rc=0 if var.id in self.boundsVars: print("WARNING (7.1): Boundary Variable", var.id, "should not have missing_value attribute") self.warn = self.warn + 1 elif var.id in self.climatologyVars: print("ERROR (7.4): Climatology Variable", var.id, "must not have missing_value attribute") self.err = self.err + 1 rc = 0 except ValueError: # if type(missingValue) == type(Numeric.array([])): # print "ERROR (2.5.1): missing_value should be a scalar value" # self.err = self.err+1 # rc=0 # else: print("ValueError:", sys.exc_info()[1]) print("INFO: Could not complete tests on missing_value attribute") raise return rc # ------------------------------------ def chkAxisAttribute(self, varName): # ------------------------------------ """Check validity of axis attribute""" var = self.f[varName] if 'axis' in var.attributes: if not re.match('^(X|Y|Z|T)$', var.attributes['axis'], re.I): print("ERROR (4): Invalid value for axis attribute") self.err = self.err + 1 return 0 # axis attribute is allowed on an aux coord var as of CF-1.6 if self.version >= vn1_1 and self.version < vn1_6 and varName in self.auxCoordVars: print("ERROR (4): Axis attribute is not allowed for auxiliary coordinate variables.") self.err = self.err + 1 return 0 # Check that axis attribute is consistent with the coordinate type # deduced from units and positive. if hasattr(var, 'units'): if hasattr(var, 'positive'): interp = self.getInterpretation(var.units, var.positive) else: interp = self.getInterpretation(var.units) else: # Variable does not have a units attribute so a consistency check cannot be made interp = None # print "interp:",interp # print "axis:",var.axis if interp is not None: # It was possible to deduce axis interpretation from units/positive if interp != var.axis: print("ERROR (4): axis attribute inconsistent with coordinate type as deduced from units and/or positive") self.err = self.err + 1 return 0 return 1 # ---------------------------------------- def chkPositiveAttribute(self, varName): # ---------------------------------------- var = self.f[varName] if 'positive' in var.attributes: if not re.match('^(down|up)$', var.attributes['positive'], re.I): print("ERROR (4.3): Invalid value for positive attribute") self.err = self.err + 1 return 0 return 1 # ----------------------------------------- def chkTimeVariableAttributes(self, varName): # ----------------------------------------- rc = 1 var = self.f[varName] if 'calendar' in var.attributes: if not re.match('(gregorian|standard|proleptic_gregorian|noleap|365_day|all_leap|366_day|360_day|julian|none)', var.attributes['calendar'], re.I): # Non-standardized calendar so month_lengths should be present if 'month_lengths' not in var.attributes: print("ERROR (4.4.1): Non-standard calendar, so month_lengths attribute must be present") self.err = self.err + 1 rc = 0 else: if 'month_lengths' in var.attributes or \ 'leap_year' in var.attributes or \ 'leap_month' in var.attributes: print("ERROR (4.4.1): The attributes 'month_lengths', 'leap_year' and 'leap_month' must not appear when 'calendar' is present.") self.err = self.err + 1 rc = 0 if 'calendar' not in var.attributes and 'month_lengths' not in var.attributes: print("WARNING (4.4.1): Use of the calendar and/or month_lengths attributes is recommended for time coordinate variables") self.warn = self.warn + 1 rc = 0 if 'month_lengths' in var.attributes: if len(var.attributes['month_lengths']) != 12 and \ self.getTypeCode(var.attributes['month_lengths']) != 'i': print("ERROR (4.4.1): Attribute 'month_lengths' should be an integer array of size 12") self.err = self.err + 1 rc = 0 if 'leap_year' in var.attributes: if self.getTypeCode(var.attributes['leap_year']) != 'i' and \ len(var.attributes['leap_year']) != 1: print("ERROR (4.4.1): leap_year should be a scalar value") self.err = self.err + 1 rc = 0 if 'leap_month' in var.attributes: if not re.match("^(1|2|3|4|5|6|7|8|9|10|11|12)$", str(var.attributes['leap_month'][0])): print("ERROR (4.4.1): leap_month should be between 1 and 12") self.err = self.err + 1 rc = 0 if 'leap_year' not in var.attributes: print("WARNING (4.4.1): leap_month is ignored as leap_year NOT specified") self.warn = self.warn + 1 # Time units must contain a reference time # To do this; test if the "unit" in question is convertible with a known timestamp "unit". varUnits = udunits.ut_parse(self.unitSystem, var.units, "UT_ASCII") secsSinceEpoch = udunits.ut_parse(self.unitSystem, "seconds since 1970-01-01", "UT_ASCII") if not udunits.ut_are_convertible(secsSinceEpoch, varUnits): print("ERROR (4.4): Invalid units and/or reference time") self.err = self.err + 1 # Free resources used by varUnits and secsSinceEpoch udunits.ut_free(varUnits) udunits.ut_free(secsSinceEpoch) return rc # ---------------------------------- def chkDescription(self, varName): # ---------------------------------- """Check 1) standard_name & long_name attributes are present 2) for a valid standard_name as listed in the standard name table.""" rc = 1 var = self.f[varName] if 'standard_name' not in var.attributes and \ 'long_name' not in var.attributes: exceptions = self.boundsVars + self.climatologyVars + self.gridMappingVars if var.id not in exceptions: print("WARNING (3): No standard_name or long_name attribute specified") self.warn = self.warn + 1 if 'standard_name' in var.attributes: # Check if valid by the standard_name table and allowed modifiers std_name = var.attributes['standard_name'] # standard_name attribute can comprise a standard_name only or a standard_name # followed by a modifier (E.g. atmosphere_cloud_liquid_water_content status_flag) std_name_el = std_name.split() if not std_name_el: print("ERROR (3.3): Empty string for 'standard_name' attribute") self.err = self.err + 1 rc = 0 elif not self.parseBlankSeparatedList(std_name) or len(std_name_el) > 2: print("ERROR (3.3): Invalid syntax for 'standard_name' attribute: '" + std_name + "'") self.err = self.err + 1 rc = 0 else: # Validate standard_name name = std_name_el[0] if name not in self.std_name_dh.dict.keys(): if chkDerivedName(name): print("ERROR (3.3): Invalid standard_name:", name) self.err = self.err + 1 rc = 0 if len(std_name_el) == 2: # Validate modifier modifier = std_name_el[1] if modifier not in ['detection_minimum', 'number_of_observations', 'standard_error', 'status_flag']: print("ERROR (3.3): Invalid standard_name modifier: " + modifier) rc = 0 return rc # ----------------------------------- def chkCompressAttr(self, varName): # ----------------------------------- rc = 1 var = self.f[varName] if 'compress' in var.attributes: compress = var.attributes['compress'] if var.typecode() != 'i': print("ERROR (8.2):", var.id, "- compress attribute can only be attached to variable of type int.") self.err = self.err + 1 return 0 if not re.search("^[a-zA-Z0-9_ ]*$", compress): print("ERROR (8.2): Invalid syntax for 'compress' attribute") self.err = self.err + 1 rc = 0 else: dimensions = compress.split() dimProduct = 1 for x in dimensions: found = 'false' if x in self.f.axes.keys(): # Get product of compressed dimension sizes for use later # dimProduct=dimProduct*self.f.dimensions[x] dimProduct = dimProduct * len(self.f.dimensionarray(x)) found = 'true' if found != 'true': print("ERROR (8.2): compress attribute naming non-existent dimension: ", x) self.err = self.err + 1 rc = 0 values = var.getValue() outOfRange = 0 for val in values[:]: if val < 0 or val > dimProduct - 1: outOfRange = 1 break if outOfRange: print("ERROR (8.2): values of", var.id, "must be in the range 0 to", dimProduct - 1) self.err = self.err + 1 return rc # --------------------------------- def chkPackedData(self, varName): # --------------------------------- rc = 1 var = self.f[varName] if 'scale_factor' in var.attributes and 'add_offset' in var.attributes: if self.getTypeCode(var.attributes['scale_factor']) != self.getTypeCode(var.attributes['add_offset']): print("ERROR (8.1): scale_factor and add_offset must be the same numeric data type") self.err = self.err + 1 # No point running rest of packed data tests return 0 if 'scale_factor' in var.attributes: typ = var.attributes['scale_factor'].dtype.char elif 'add_offset' in var.attributes: typ = var.attributes['add_offset'].dtype.char else: # No packed Data attributes present return 1 varType = self.getTypeCode(var) # One or other attributes present; run remaining checks if varType != typ: if typ != 'f' and typ != 'd': print("ERROR (8.1): scale_factor and add_offset must be of type float or double") self.err = self.err + 1 rc = 0 if varType != 'b' and varType != 'h' and varType != 'i': print("ERROR (8.1):", var.id, "must be of type byte, short or int") self.err = self.err + 1 rc = 0 if typ == 'f' and varType == 'i': print("WARNING (8.1): scale_factor/add_offset are type float, therefore", var.id, "should not be of type int") self.warn = self.warn + 1 return rc # ---------------------------- def chkFlags(self, varName): # ---------------------------- var = self.f[varName] rc = 1 if 'flag_meanings' in var.attributes: # Flag to indicate whether one of flag_values or flag_masks present values_or_masks = 0 meanings = var.attributes['flag_meanings'] # if not self.parseBlankSeparatedList(meanings): if not self.extendedBlankSeparatedList(meanings): print("ERROR (3.5): Invalid syntax for 'flag_meanings' attribute") self.err = self.err + 1 rc = 0 if 'flag_values' in var.attributes: values_or_masks = 1 values = var.attributes['flag_values'] # If values is a string of chars, split it up into a list of chars # print "Ros: flag_values:",values # print "Ros: flag_values type:",type(values) # if type(values) == str: # print "Ros - flag_values is a string" # values = values.split() # print "Ros: after split:",values # print "Ros: after split:",type(values) retcode = self.equalNumOfValues(values, meanings) if retcode == -1: print("ERROR (3.5): Problem in subroutine equalNumOfValues") rc = 0 elif not retcode: print("ERROR (3.5): Number of flag_values values must equal the number or words/phrases in flag_meanings") self.err = self.err + 1 rc = 0 # flag_values values must be mutually exclusive if isinstance(values, str): values = values.split() if not self.uniqueList(values): print("ERROR (3.5): flag_values attribute must contain a list of unique values") self.err = self.err + 1 rc = 0 if 'flag_masks' in var.attributes: values_or_masks = 1 masks = var.attributes['flag_masks'] retcode = self.equalNumOfValues(masks, meanings) if retcode == -1: print("ERROR (3.5): Problem in subroutine equalNumOfValues") rc = 0 elif not retcode: print("ERROR (3.5): Number of flag_masks values must equal the number or words/phrases in flag_meanings") self.err = self.err + 1 rc = 0 # flag_values values must be non-zero for v in masks: if v == 0: print("ERROR (3.5): flag_masks values must be non-zero") self.err = self.err + 1 rc = 0 # Doesn't make sense to do bitwise comparison for char variable if self.getTypeCode(var) != 'c': if 'flag_values' in var.attributes and 'flag_masks' in var.attributes: # Both flag_values and flag_masks present # Do a bitwise AND of each flag_value and its corresponding flag_mask value, # the result must be equal to the flag_values entry i = 0 for v in values: bitwise_AND = v & masks[i] if bitwise_AND != v: print("WARNING (3.5): Bitwise AND of flag_value", v, "and corresponding flag_mask", masks[i], "doesn't match flag_value.") self.warn = self.warn + 1 i = i + 1 if values_or_masks == 0: # flag_meanings attribute present, but no flag_values or flag_masks print("ERROR (3.5): flag_meanings present, but no flag_values or flag_masks specified") self.err = self.err + 1 rc = 0 if 'flag_values' in var.attributes and 'flag_meanings' not in var.attributes: print("ERROR (3.5): flag_meanings attribute is missing") self.err = self.err + 1 rc = 0 return rc # ----------------------- def getType(self, arg): # ----------------------- if isinstance(arg, numpy.ndarray): return "array" if isinstance(arg, str): return "str" if isinstance(arg, list): return "list" print(" ERROR: Unknown Type in getType(" + arg + ")") return 0 # ---------------------------------------- def equalNumOfValues(self, arg1, arg2): # ---------------------------------------- """ Check that arg1 and arg2 contain the same number of blank-separated elements.""" # Determine the type of both arguments. strings and arrays need to be handled differently type_arg1 = self.getType(arg1) type_arg2 = self.getType(arg2) if not type_arg1 or not type_arg2: return -1 if type_arg1 == "str": len_arg1 = len(arg1.split()) else: len_arg1 = len(arg1) if type_arg2 == "str": len_arg2 = len(arg2.split()) else: len_arg2 = len(arg2) if len_arg1 != len_arg2: return 0 return 1 # ------------------------------------------ def chkMultiDimCoord(self, varName, axes): # ------------------------------------------ """If a coordinate variable is multi-dimensional, then it is recommended that the variable name should not match the name of any of its dimensions.""" var = self.f[varName] # This is a temporary work around to obtain the dimensions of the coord # var. In CDMS vn4.0 only 1D coord vars will be axis variables; There # will be no need to use _obj_. See CRM #011 if var.id in axes and len(var._obj_.dimensions) > 1: # Multi-dimensional coordinate var if var.id in var._obj_.dimensions: print("WARNING (5): The name of a multi-dimensional coordinate variable") print(" should not match the name of any of its dimensions.") self.warn = self.warn + 1 # -------------------------------------- def chkValuesMonotonic(self, varName): # -------------------------------------- """A coordinate variable must have values that are strictly monotonic (increasing or decreasing).""" # rc=1 var = self.f[varName] values = var.getValue() i = 0 for val in values[:]: if i == 0: # First value - no comparison to do i = i + 1 lastVal = val continue elif i == 1: i = i + 1 if val < lastVal: # Decreasing sequence typ = 'decr' elif val > lastVal: # Increasing sequence typ = 'incr' else: # Same value - ERROR print("ERROR (5): coordinate variable '" + var.id + "' not monotonic") self.err = self.err + 1 return 1 lastVal = val else: i = i + 1 if val < lastVal and typ != 'decr': # ERROR - should be increasing value print("ERROR (5): coordinate variable '" + var.id + "' not monotonic") self.err = self.err + 1 return 1 elif val > lastVal and typ != 'incr': # ERROR - should be decreasing value print("ERROR (5): coordinate variable '" + var.id + "' not monotonic") self.err = self.err + 1 return 1 lastVal = val def getargs(arglist): '''getargs(arglist): parse command line options and environment variables''' from getopt import getopt, GetoptError from os import environ from sys import stderr udunitskey = 'UDUNITS' standardnamekey = 'CF_STANDARD_NAMES' areatypeskey = 'CF_AREA_TYPES' # set defaults udunits = None standardname = STANDARDNAME areatypes = AREATYPES uploader = None useFileName = "yes" badc = None coards = None version = newest_version # set to environment variables if udunitskey in environ: udunits = environ[udunitskey] if standardnamekey in environ: standardname = environ[standardnamekey] if areatypeskey in environ: areatypes = environ[areatypeskey] try: (opts, args) = getopt(arglist[1:], 'a:bchlnu:s:v:', ['area_types=', 'badc', 'coards', 'help', 'uploader', 'noname', 'udunits=', 'cf_standard_names=', 'version=']) except GetoptError: stderr.write('%s\n' % __doc__) sys.exit(1) for a, v in opts: if a in ('-a', '--area_types'): areatypes = v.strip() continue if a in ('-b', '--badc'): badc = "yes" continue if a in ('-c', '--coards'): coards = "yes" continue if a in ('-h', '--help'): print(__doc__) sys.exit(0) if a in ('-l', '--uploader'): uploader = "yes" continue if a in ('-n', '--noname'): useFileName = "no" continue if a in ('-u', '--udunits'): udunits = v.strip() continue if a in ('-s', '--cf_standard_names'): standardname = v.strip() continue if a in ('-v', '--version'): if v == 'auto': version = CFVersion() else: try: version = CFVersion(v) except ValueError: print("WARNING: '%s' cannot be parsed as a version number." % v) print("Performing check against newest version", newest_version) if version not in cfVersions: print("WARNING: %s is not a valid CF version." % version) print("Performing check against newest version", newest_version) version = newest_version continue if not args: stderr.write('ERROR in command line\n\nusage:\n%s\n' % __doc__) sys.exit(1) return (badc, coards, uploader, useFileName, standardname, areatypes, udunits, version, args) # -------------------------- # Main Program # -------------------------- if __name__ == '__main__': (badc, coards, uploader, useFileName, standardName, areaTypes, udunitsDat, version, files) = getargs(sys.argv) inst = CFChecker(uploader=uploader, useFileName=useFileName, badc=badc, coards=coards, cfStandardNamesXML=standardName, cfAreaTypesXML=areaTypes, udunitsDat=udunitsDat, version=version) for f in files: rc = inst.checker(f) sys.exit(rc) gdalautotest-3.2.2/gdrivers/ntv1.py0000775000175000017500000000370014020414370015761 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ntv1.py 2130dafb9f93748cba2f2d016483d48986321aec 2020-05-10 17:04:38 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: NTv1 Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2018, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import sys sys.path.append('../pymod') import gdaltest ############################################################################### # Open a NTv1 grid def test_ntv1_1(): tst = gdaltest.GDALTest('NTV1', 'ntv1/ntv1_can_truncated.dat', 1, 65532) gt = (-44.375, 0.25, 0.0, 40.375, 0.0, -0.25) return tst.testOpen(check_gt=gt, check_prj='WGS84') gdalautotest-3.2.2/gdrivers/rmf.py0000775000175000017500000006200714020414370015662 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: rmf.py fe1d099b252225f85259e2a5844885c9935e00b4 2020-05-10 12:53:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Raster Matrix Format used in GISes "Panorama"/"Integratsia". # Author: Andrey Kiselev # ############################################################################### # Copyright (c) 2008, Andrey Kiselev # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import gdaltest from osgeo import gdal from osgeo import osr import pytest ############################################################################### # Perform simple read tests. def test_rmf_1(): tst = gdaltest.GDALTest('rmf', 'rmf/byte.rsw', 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_rmf_2(): tst = gdaltest.GDALTest('rmf', 'rmf/byte-lzw.rsw', 1, 40503) with gdaltest.error_handler(): return tst.testOpen() def test_rmf_3(): tst = gdaltest.GDALTest('rmf', 'rmf/float64.mtw', 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_rmf_4(): tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 1, 21212) tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 2, 21053) tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 3, 21349) tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) def test_rmf_5(): tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall-lzw.rsw', 1, 40503) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall-lzw.rsw', 2, 41429) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall-lzw.rsw', 3, 40238) with gdaltest.error_handler(): return tst.testOpen() def test_rmf_6(): tst = gdaltest.GDALTest('rmf', 'rmf/big-endian.rsw', 1, 7782) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('rmf', 'rmf/big-endian.rsw', 2, 8480) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('rmf', 'rmf/big-endian.rsw', 3, 4195) with gdaltest.error_handler(): return tst.testOpen() ############################################################################### # Create simple copy and check. def test_rmf_7(): tst = gdaltest.GDALTest('rmf', 'rmf/byte.rsw', 1, 4672) return tst.testCreateCopy(check_srs=1, check_gt=1, vsimem=1) def test_rmf_8(): tst = gdaltest.GDALTest('rmf', 'rmf/rgbsmall.rsw', 2, 21053) return tst.testCreateCopy(check_srs=1, check_gt=1) ############################################################################### # Create RMFHUGE=YES def test_rmf_9(): tst = gdaltest.GDALTest('rmf', 'rmf/byte.rsw', 1, 4672, options=['RMFHUGE=YES']) return tst.testCreateCopy(check_srs=1, check_gt=1, vsimem=1) ############################################################################### # Compressed DEM def test_rmf_10(): tst = gdaltest.GDALTest('rmf', 'rmf/t100.mtw', 1, 6388) with gdaltest.error_handler(): return tst.testOpen() ############################################################################### # Overviews def test_rmf_11(): test_fn = '/vsigzip/data/rmf/overviews.rsw.gz' src_ds = gdal.Open(test_fn) assert src_ds is not None, 'Failed to open test dataset.' band1 = src_ds.GetRasterBand(1) assert band1.GetOverviewCount() == 3, 'overviews is missing' ovr_n = (0, 1, 2) ovr_size = (256, 64, 16) ovr_checksum = (32756, 51233, 3192) for i in ovr_n: ovr_band = band1.GetOverview(i) if ovr_band.XSize != ovr_size[i] or ovr_band.YSize != ovr_size[i]: msg = 'overview wrong size: overview %d, size = %d * %d,' % \ (i, ovr_band.XSize, ovr_band.YSize) pytest.fail(msg) if ovr_band.Checksum() != ovr_checksum[i]: msg = 'overview wrong checksum: overview %d, checksum = %d,' % \ (i, ovr_band.Checksum()) pytest.fail(msg) ############################################################################### # Check file open with cucled header offsets . def test_rmf_12a(): tst = gdaltest.GDALTest('rmf', 'rmf/cucled-1.rsw', 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) ############################################################################### # Check file open with cucled header offsets . def test_rmf_12b(): tst = gdaltest.GDALTest('rmf', 'rmf/cucled-2.rsw', 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) ############################################################################### # Check file open with invalid subheader marker. def test_rmf_12c(): tst = gdaltest.GDALTest('rmf', 'rmf/invalid-subheader.rsw', 1, 4672) with gdaltest.error_handler(): return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) ############################################################################### # Check file open with corrupted subheader. def test_rmf_12d(): tst = gdaltest.GDALTest('rmf', 'rmf/corrupted-subheader.rsw', 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) ############################################################################### # Build overviews and check def rmf_build_ov(source, testid, options, ov_sizes, crs, reopen=False, pass_count=1): rmf_drv = gdal.GetDriverByName('RMF') assert rmf_drv is not None, 'RMF driver not found.' src_ds = gdal.Open(source, gdal.GA_ReadOnly) assert src_ds is not None, 'Failed to open test dataset.' test_ds_name = 'tmp/ov-' + testid + '.tst' src_ds = rmf_drv.CreateCopy(test_ds_name, src_ds, options=options) assert src_ds is not None, 'Failed to create test dataset copy.' for _ in range(pass_count): if reopen: src_ds = None src_ds = gdal.Open(test_ds_name, gdal.GA_Update) assert src_ds is not None, 'Failed to open test dataset.' reopen = True err = src_ds.BuildOverviews(overviewlist=[2, 4]) assert err == 0, 'BuildOverviews reports an error' src_ds = None src_ds = gdal.Open(test_ds_name, gdal.GA_ReadOnly) for iBand in range(src_ds.RasterCount): band = src_ds.GetRasterBand(iBand + 1) assert band.GetOverviewCount() == 2, 'overviews missing' for iOverview in range(band.GetOverviewCount()): ovr_band = band.GetOverview(iOverview) if ovr_band.XSize != ov_sizes[iOverview][0] or \ ovr_band.YSize != ov_sizes[iOverview][1]: msg = 'overview wrong size: band %d, overview %d, size = %d * %d,' % \ (iBand, iOverview, ovr_band.XSize, ovr_band.YSize) pytest.fail(msg) if ovr_band.Checksum() != crs[iOverview][iBand]: msg = 'overview wrong checksum: band %d, overview %d, checksum = %d,' % \ (iBand, iOverview, ovr_band.Checksum()) pytest.fail(msg) src_ds = None os.remove(test_ds_name) ############################################################################### # Build overviews on newly created RSW file def test_rmf_13(): return rmf_build_ov(source='data/rmf/byte.rsw', testid='13', options=['RMFHUGE=NO'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087, 1087, 1087], [328, 328, 328]], reopen=False) ############################################################################### # Build overviews on newly created huge RSW file def test_rmf_14(): return rmf_build_ov(source='data/rmf/byte.rsw', testid='14', options=['RMFHUGE=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087, 1087, 1087], [328, 328, 328]], reopen=False) ############################################################################### # Build overviews on closed and reopened RSW file def test_rmf_15(): return rmf_build_ov(source='data/rmf/byte.rsw', testid='15', options=['RMFHUGE=NO'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087, 1087, 1087], [328, 328, 328]], reopen=True) ############################################################################### # Build overviews on closed and reopened huge RSW file def test_rmf_16(): return rmf_build_ov(source='data/rmf/byte.rsw', testid='16', options=['RMFHUGE=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087, 1087, 1087], [328, 328, 328]], reopen=True) ############################################################################### # Build overviews on newly created MTW file def test_rmf_17(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='17', options=['RMFHUGE=NO', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087, 1087, 1087], [328, 328, 328]], reopen=False) ############################################################################### # Build overviews on newly created MTW file def test_rmf_18(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='18', options=['RMFHUGE=YES', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087], [328]], reopen=False) ############################################################################### # Build overviews on closed and reopened MTW file def test_rmf_19(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='19', options=['RMFHUGE=NO', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087], [328]], reopen=True) ############################################################################### # Build overviews on closed and reopened huge MTW file def test_rmf_20(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='20', options=['RMFHUGE=YES', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087], [328]], reopen=True) ############################################################################### # Recreate overviews on newly created MTW file def test_rmf_21(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='21', options=['RMFHUGE=NO', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087], [328]], reopen=False, pass_count=2) ############################################################################### # Recreate overviews on newly created huge MTW file def test_rmf_22(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='22', options=['RMFHUGE=YES', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087], [328]], reopen=False, pass_count=2) ############################################################################### # Recreate overviews on closed and reopened MTW file def test_rmf_23(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='23', options=['RMFHUGE=NO', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087], [328]], reopen=True, pass_count=2) ############################################################################### # Recreate overviews on closed and reopened huge MTW file def test_rmf_24(): return rmf_build_ov(source='data/rmf/float64.mtw', testid='24', options=['RMFHUGE=YES', 'MTW=YES'], ov_sizes=[[10, 10], [5, 5]], crs=[[1087], [328]], reopen=True, pass_count=2) ############################################################################### # Nodata write test def test_rmf_25(): rmf_drv = gdal.GetDriverByName('RMF') assert rmf_drv is not None, 'RMF driver not found.' src_ds = gdal.Open('data/rmf/byte.rsw', gdal.GA_ReadOnly) assert src_ds is not None, 'Failed to open test dataset.' test_ds_name = 'tmp/nodata.rsw' test_ds = rmf_drv.CreateCopy(test_ds_name, src_ds) assert test_ds is not None, 'Failed to create test dataset copy.' test_ds.GetRasterBand(1).SetNoDataValue(33) nd = test_ds.GetRasterBand(1).GetNoDataValue() assert nd == 33, 'Invalid NoData value after CreateCopy.' test_ds = None test_ds = gdal.Open(test_ds_name, gdal.GA_Update) assert test_ds is not None, 'Failed to reopen test dataset.' nd = test_ds.GetRasterBand(1).GetNoDataValue() assert nd == 33, 'Invalid NoData value after dataset reopen.' test_ds.GetRasterBand(1).SetNoDataValue(55) test_ds = None test_ds = gdal.Open(test_ds_name, gdal.GA_ReadOnly) assert test_ds is not None, 'Failed to reopen test dataset.' nd = test_ds.GetRasterBand(1).GetNoDataValue() assert nd == 55, 'Invalid NoData value after dataset update.' test_ds = None os.remove(test_ds_name) ############################################################################### # Unit write test def test_rmf_26(): rmf_drv = gdal.GetDriverByName('RMF') assert rmf_drv is not None, 'RMF driver not found.' src_ds = gdal.Open('data/rmf/float64.mtw', gdal.GA_ReadOnly) assert src_ds is not None, 'Failed to open test dataset.' test_ds_name = 'tmp/unit.mtw' test_ds = rmf_drv.CreateCopy(test_ds_name, src_ds, options=['MTW=YES']) assert test_ds is not None, 'Failed to create test dataset copy.' test_ds.GetRasterBand(1).SetUnitType('cm') unittype = test_ds.GetRasterBand(1).GetUnitType() assert unittype == 'cm', 'Invalid UnitType after CreateCopy.' test_ds = None test_ds = gdal.Open(test_ds_name, gdal.GA_Update) assert test_ds is not None, 'Failed to reopen test dataset.' unittype = test_ds.GetRasterBand(1).GetUnitType() assert unittype == 'cm', 'Invalid UnitType after dataset reopen.' test_ds.GetRasterBand(1).SetUnitType('mm') test_ds = None test_ds = gdal.Open(test_ds_name, gdal.GA_ReadOnly) assert test_ds is not None, 'Failed to reopen test dataset.' unittype = test_ds.GetRasterBand(1).GetUnitType() assert unittype == 'mm', 'Invalid UnitType after dataset update.' test_ds.GetRasterBand(1).SetUnitType('ft') unittype = test_ds.GetRasterBand(1).GetUnitType() assert unittype == 'mm', 'Invalid UnitType after dataset update.' test_ds = None os.remove(test_ds_name) ############################################################################### # Test read JPEG compressed RMF dataset def test_rmf_27(): if gdal.GetDriverByName('JPEG') is None: pytest.skip() cs1 = [50553, 27604, 36652] # cs2 = [51009, 27640, 37765] # osx, clang ds = gdal.Open('data/rmf/jpeg-in-rmf.rsw', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open test dataset.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['COMPRESSION'] == 'JPEG', \ ('"COMPRESSION" value is "%s" but expected "JPEG"' % md['COMPRESSION']) cs = [0, 0, 0] for iBand in range(ds.RasterCount): band = ds.GetRasterBand(iBand + 1) cs[iBand] = band.Checksum() assert cs == cs1 or cs == cs2, ('Invalid checksum %s expected %s or %s.' % (str(cs), str(cs1), str(cs2))) ############################################################################### # Check compression metadata def test_rmf_28a(): ds = gdal.Open('data/rmf/byte-lzw.rsw', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open test dataset.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['COMPRESSION'] == 'LZW', \ ('"COMPRESSION" value is "%s" but expected "LZW"' % md['COMPRESSION']) def test_rmf_28b(): ds = gdal.Open('data/rmf/t100.mtw', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open test dataset.' md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['COMPRESSION'] == 'RMF_DEM', \ ('"COMPRESSION" value is "%s" but expected "RMF_DEM"' % md['COMPRESSION']) ############################################################################### # Check EPSG code def test_rmf_29(): rmf_drv = gdal.GetDriverByName('RMF') assert rmf_drv is not None, 'RMF driver not found.' ds = gdal.Open('data/rmf/byte.rsw', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open test dataset.' test_ds_name = 'tmp/epsg.rsw' test_ds = rmf_drv.CreateCopy(test_ds_name, ds) assert test_ds is not None, 'Failed to create test dataset copy.' sr = osr.SpatialReference() sr.SetFromUserInput('EPSG:3388') test_ds.SetProjection(sr.ExportToWkt()) test_ds = None; ds = None test_ds = gdal.Open(test_ds_name, gdal.GA_ReadOnly) assert test_ds is not None, 'Failed to open test dataset.' wkt = test_ds.GetProjectionRef() sr = osr.SpatialReference() sr.SetFromUserInput(wkt) assert str(sr.GetAuthorityCode(None)) == '3388', ('EPSG code is %s expected 3388.' % str(sr.GetAuthorityCode(None))) ############################################################################### # Check interleaved access def test_rmf_30(): ds_name = 'tmp/interleaved.tif' gdal.Translate(ds_name, 'data/rmf/rgbsmall-lzw.rsw', format='GTiff') ds = gdal.Open(ds_name) assert ds is not None, ('Can\'t open ' + ds_name) expected_cs = [40503, 41429, 40238] cs = [ds.GetRasterBand(1).Checksum(), ds.GetRasterBand(2).Checksum(), ds.GetRasterBand(3).Checksum()] assert cs == expected_cs, ('Invalid checksum %s expected %s.' % (str(cs), str(expected_cs))) ############################################################################### # Check compressed write def test_rmf_31a(): tst = gdaltest.GDALTest('rmf', 'small_world.tif', 1, 30111, options=['COMPRESS=NONE']) return tst.testCreateCopy(check_minmax=0, check_srs=1, check_gt=1) def test_rmf_31b(): tst = gdaltest.GDALTest('rmf', 'small_world.tif', 1, 30111, options=['COMPRESS=LZW']) return tst.testCreateCopy(check_minmax=0, check_srs=1, check_gt=1) def test_rmf_31c(): ds_name = 'tmp/rmf_31c.rsw' gdal.Translate(ds_name, 'data/small_world.tif', format='RMF', options='-co COMPRESS=JPEG') ds = gdal.Open(ds_name) assert ds is not None, ('Can\'t open ' + ds_name) expected_cs1 = [25789, 27405, 31974] expected_cs2 = [23764, 25265, 33585] # osx cs = [ds.GetRasterBand(1).Checksum(), ds.GetRasterBand(2).Checksum(), ds.GetRasterBand(3).Checksum()] assert cs == expected_cs1 or cs == expected_cs2, \ ('Invalid checksum %s expected %s or %s.' % (str(cs), str(expected_cs1), str(expected_cs2))) def test_rmf_31d(): tst = gdaltest.GDALTest('rmf', 'rmf/t100.mtw', 1, 6388, options=['MTW=YES', 'COMPRESS=RMF_DEM']) return tst.testCreateCopy(check_minmax=0, check_srs=1, check_gt=1) def test_rmf_31e(): try: import numpy except ImportError: pytest.skip() drv = gdal.GetDriverByName('Gtiff') if drv is None: pytest.skip() # Create test data stripeSize = 32; sx = 256 sy = 8*stripeSize tst_name = 'tmp/rmf_31e.tif' tst_ds = drv.Create(tst_name, sx, sy, 1, gdal.GDT_Int32 ) assert tst_ds is not None, ('Can\'t create ' + tst_name) # No deltas buff = numpy.zeros((sx, stripeSize), dtype = numpy.int32) tst_ds.GetRasterBand(1).WriteArray(buff, 0, 0) # 4-bit deltas buff = numpy.random.randint(0, 16, [stripeSize, sx]) tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize) # 8-bit deltas buff = numpy.random.randint(0, 256, [stripeSize, sx]) tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*2) # 12-bit deltas buff = numpy.random.randint(0, 256*16, [stripeSize, sx]) tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*3) # 16-bit deltas buff = numpy.random.randint(0, 256*256, [stripeSize, sx]) tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*4) # 24-bit deltas buff = numpy.random.randint(0, 256*256*256, [stripeSize, sx]) tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*5) # 32-bit deltas buff = numpy.random.randint(0, 256*256*256*128 - 1, [stripeSize, sx]) tst_ds.GetRasterBand(1).WriteArray(buff, 0, stripeSize*6) tst_ds = None tst_ds = gdal.Open(tst_name) assert tst_ds is not None, ('Can\'t open ' + tst_name) cs = tst_ds.GetRasterBand(1).Checksum() tst_ds = None tst = gdaltest.GDALTest('rmf', '../' + tst_name, 1, cs, options=['MTW=YES', 'COMPRESS=RMF_DEM']) return tst.testCreateCopy(check_minmax=0, check_srs=1, check_gt=1) ############################################################################### # Check parallel compression def test_rmf_32a(): ds_name = 'tmp/rmf_32a.rsw' gdal.Translate(ds_name, 'data/small_world.tif', format='RMF', options='-outsize 400% 400% -co COMPRESS=LZW -co NUM_THREADS=0') tst = gdaltest.GDALTest('rmf', '../' + ds_name, 1, 5540) res = tst.testOpen(check_gt=None) os.remove(ds_name) return res def test_rmf_32b(): ds_name = 'tmp/rmf_32b.rsw' gdal.Translate(ds_name, 'data/small_world.tif', format='RMF', options='-outsize 400% 400% -co COMPRESS=LZW -co NUM_THREADS=4') tst = gdaltest.GDALTest('rmf', '../' + ds_name, 1, 5540) res = tst.testOpen(check_gt=None) os.remove(ds_name) return res ############################################################################### # Parallel build overviews on newly created RSW file def test_rmf_32c(): ds_name = 'tmp/rmf_32c.rsw' gdal.Translate(ds_name, 'data/small_world.tif', format='RMF', options='-outsize 400% 400% -co COMPRESS=LZW -co NUM_THREADS=4') res = rmf_build_ov(source=ds_name, testid='32c', options=['RMFHUGE=NO', 'COMPRESS=LZW', 'NUM_THREADS=4'], ov_sizes=[[800, 400], [400, 200]], crs=[[50261, 64846, 28175], [30111, 32302, 40026]], reopen=False) os.remove(ds_name) return res ############################################################################### # Read 1-bit & 4-bit files def test_rmf_33a(): tst = gdaltest.GDALTest('rmf', 'rmf/1bit.rsw', 1, 34325) return tst.testOpen() def test_rmf_33b(): tst = gdaltest.GDALTest('rmf', 'rmf/4bit.rsw', 1, 55221) return tst.testOpen() def test_rmf_33c(): tst = gdaltest.GDALTest('rmf', 'rmf/4bit-lzw.rsw', 1, 55221) return tst.testOpen() ############################################################################### gdalautotest-3.2.2/gdrivers/bag.py0000775000175000017500000010107514020414370015626 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: bag.py b475f2c395311290ca147fedd993efd7e9f34f09 2020-08-18 15:37:29 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for BAG driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2010-2013, Even Rouault # Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from xml.etree import ElementTree import gdaltest import os import pytest import struct from osgeo import gdal from osgeo import ogr pytestmark = pytest.mark.require_driver('BAG') @pytest.fixture(autouse=True, scope='module') def check_no_file_leaks(): num_files = len(gdaltest.get_opened_files()) yield diff = len(gdaltest.get_opened_files()) - num_files if diff != 0 and gdaltest.is_travis_branch('trusty_clang'): print('Mysterious leak of file handle on trusty_clang') return assert diff == 0, 'Leak of file handles: %d leaked' % diff ############################################################################### # Confirm various info on true_n_nominal 1.1 sample file. def test_bag_2(): ds = gdal.Open('data/bag/true_n_nominal.bag') cs = ds.GetRasterBand(1).Checksum() assert cs == 1072, ('Wrong checksum on band 1, got %d.' % cs) cs = ds.GetRasterBand(2).Checksum() assert cs == 150, ('Wrong checksum on band 2, got %d.' % cs) cs = ds.GetRasterBand(3).Checksum() assert cs == 1315, ('Wrong checksum on band 3, got %d.' % cs) b1 = ds.GetRasterBand(1) assert b1.GetMinimum() == pytest.approx(10, abs=0.01), 'band 1 minimum wrong.' assert b1.GetMaximum() == pytest.approx(19.8, abs=0.01), 'band 1 maximum wrong.' assert b1.GetNoDataValue() == pytest.approx(1000000.0, abs=0.1), 'band 1 nodata wrong.' b2 = ds.GetRasterBand(2) assert b2.GetNoDataValue() == pytest.approx(1000000.0, abs=0.1), 'band 2 nodata wrong.' b3 = ds.GetRasterBand(3) assert b3.GetNoDataValue() == pytest.approx(0.0, abs=0.1), 'band 3 nodata wrong.' # It would be nice to test srs and geotransform but they are # pretty much worthless on this dataset. # Test the xml:BAG metadata domain xmlBag = ds.GetMetadata('xml:BAG')[0] assert xmlBag.startswith('= RES_FILTER_MAX with gdaltest.error_handler(): ds = gdal.OpenEx('data/bag/test_vr.bag', open_options=['MODE=RESAMPLED_GRID', 'RES_FILTER_MIN=4', 'RES_FILTER_MAX=4']) assert ds is None # Test VALUE_POPULATION ds = gdal.OpenEx('data/bag/test_vr.bag', open_options=['MODE=RESAMPLED_GRID', 'RES_STRATEGY=MEAN', 'VALUE_POPULATION=MAX']) m1_max, M1_max, mean1_max, _ = ds.GetRasterBand(1).ComputeStatistics(False) m2_max, M2_max, mean2_max, _ = ds.GetRasterBand(2).ComputeStatistics(False) ds = gdal.OpenEx('data/bag/test_vr.bag', open_options=['MODE=RESAMPLED_GRID', 'RES_STRATEGY=MEAN', 'VALUE_POPULATION=MEAN']) m1_mean, M1_mean, mean1_mean, _ = ds.GetRasterBand( 1).ComputeStatistics(False) m2_mean, M2_mean, mean2_mean, _ = ds.GetRasterBand( 2).ComputeStatistics(False) ds = gdal.OpenEx('data/bag/test_vr.bag', open_options=['MODE=RESAMPLED_GRID', 'RES_STRATEGY=MEAN', 'VALUE_POPULATION=MIN']) m1_min, M1_min, mean1_min, _ = ds.GetRasterBand(1).ComputeStatistics(False) m2_min, M2_min, mean2_min, _ = ds.GetRasterBand(2).ComputeStatistics(False) if mean1_min >= mean1_mean or mean1_mean >= mean1_max: print(m1_max, M1_max, mean1_max) print(m2_max, M2_max, mean2_max) print(m1_mean, M1_mean, mean1_mean) print(m2_mean, M2_mean, mean2_mean) print(m1_min, M1_min, mean1_min) pytest.fail(m2_min, M2_min, mean2_min) if m2_min >= m2_max or \ (m2_mean, M2_mean, mean2_mean) != (m2_max, M2_max, mean2_max): print(m1_max, M1_max, mean1_max) print(m1_mean, M1_mean, mean1_mean) print(m1_min, M1_min, mean1_min) pytest.fail(m2_min, M2_min, mean2_min) ds = gdal.OpenEx('data/bag/test_vr.bag', open_options=['MODE=RESAMPLED_GRID', 'RES_STRATEGY=MEAN', 'VALUE_POPULATION=COUNT']) assert ds is not None assert ds.RasterCount == 1 assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt32 assert ds.GetRasterBand(1).Checksum() == 549 ############################################################################### # def test_bag_vr_resampled_mask(): ds = gdal.OpenEx('data/bag/test_vr.bag', open_options=['MODE=RESAMPLED_GRID', 'SUPERGRIDS_MASK=YES']) assert ds is not None assert ds.RasterCount == 1 assert ds.GetRasterBand(1).DataType == gdal.GDT_Byte assert ds.GetRasterBand(1).GetNoDataValue() is None cs = ds.GetRasterBand(1).Checksum() assert cs == 4552 ############################################################################### # def test_bag_write_single_band(): tst = gdaltest.GDALTest('BAG', 'byte.tif', 1, 4672) ret = tst.testCreateCopy(quiet_error_handler=False, new_filename='/vsimem/out.bag') return ret ############################################################################### # def test_bag_write_two_bands(): tst = gdaltest.GDALTest('BAG', 'bag/test_vr.bag', 2, 60, options=['BLOCK_SIZE=2', 'VAR_ABSTRACT=foo', 'VAR_XML_IDENTIFICATION_CITATION=']) tst.testCreateCopy(quiet_error_handler=False, delete_copy=False, new_filename='/vsimem/out.bag') ds = gdal.Open('/vsimem/out.bag') xml = ds.GetMetadata_List('xml:BAG')[0] assert '' in xml assert 'Generated by GDAL ' in xml assert 'VERT_CS["MLLW depth"' in xml gdal.Unlink('/vsimem/out.bag') ############################################################################### # def test_bag_write_south_up(): # Generate a south-up dataset src_ds = gdal.Warp('', 'data/byte.tif', format='MEM', outputBounds=[440720, 3751320, 441920, 3750120]) # Translate it into BAG ds = gdal.Translate('/vsimem/out.bag', src_ds) # Check that it is presented as north-up cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 gt = ds.GetGeoTransform() assert gt == (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) ds = None gdal.Unlink('/vsimem/out.bag') ############################################################################### # def test_bag_read_invalid_bag_vlen_bag_version(): os.stat('data/bag/invalid_bag_vlen_bag_version.bag') ds = gdal.Open('data/bag/invalid_bag_vlen_bag_version.bag') assert not ds def test_bag_read_incorrect_northeast_corner(): ds = gdal.Open('data/bag/test_offset_ne_corner.bag') geotransform = ds.GetGeoTransform() assert geotransform == (85.0, 30.0, 0.0, 500112.0, 0.0, -32.0) corner_points = ElementTree.fromstring(ds.GetMetadata('xml:BAG')[0])[8][0][6][0][0].text assert corner_points == '100.000000000000,500000.000000000000 250.000000000000,500096.000000000000' del ds ############################################################################### # Test reading georeferenced metadata def test_bag_read_georef_metadata(): ds = gdal.Open('data/bag/test_georef_metadata.bag') assert ds is not None sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 2 assert sub_ds[0][0] == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values' assert sub_ds[1][0] == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only' ds = gdal.OpenEx('data/bag/test_georef_metadata.bag', open_options=['MODE=LIST_SUPERGRIDS']) assert ds is not None sub_ds = ds.GetSubDatasets() assert len(sub_ds) == 74 assert sub_ds[1][0] == 'BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:0' with gdaltest.error_handler(): assert gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:not_existing') is None ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values') assert ds is not None assert ds.RasterXSize == 6 assert ds.RasterYSize == 4 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() data = struct.unpack('i' * 24, data) assert data == (0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5) assert band.GetNoDataValue() == 0 rat = band.GetDefaultRAT() assert rat is not None assert rat.GetRowCount() == 6 assert rat.GetColumnCount() == 3 assert rat.GetNameOfCol(0) == 'int' assert rat.GetTypeOfCol(0) == gdal.GFT_Integer assert rat.GetNameOfCol(1) == 'str' assert rat.GetTypeOfCol(1) == gdal.GFT_String assert rat.GetNameOfCol(2) == 'float64' assert rat.GetTypeOfCol(2) == gdal.GFT_Real assert rat.GetValueAsInt(0, 0) == 0 assert rat.GetValueAsString(0, 1) == 'Val ' assert rat.GetValueAsDouble(0, 2) == 1.25 assert rat.GetValueAsInt(1, 0) == 1 ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only') assert ds is not None assert ds.RasterXSize == 6 assert ds.RasterYSize == 4 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() data = struct.unpack('B' * 24, data) assert data == (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1) ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:0') assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() data = struct.unpack('i' * 4, data) assert data == (1, 0, 1, 1) ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_keys_values:0:1') assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() data = struct.unpack('i' * 4, data) assert data == (1, 1, 0, 1) ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only:0:0') assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() data = struct.unpack('B' * 4, data) assert data == (1, 1, 0, 1) ds = gdal.Open('BAG:"data/bag/test_georef_metadata.bag":georef_metadata:layer_with_values_only:0:1') assert ds is not None assert ds.RasterXSize == 2 assert ds.RasterYSize == 2 assert ds.RasterCount == 1 band = ds.GetRasterBand(1) data = band.ReadRaster() data = struct.unpack('B' * 4, data) assert data == (1, 0, 1, 1) ############################################################################### # def test_bag_write_single_band_create(): tmpfilename = '/vsimem/out.bag' gdal.Warp(tmpfilename, 'data/byte.tif', options='-ot Float32') ds = gdal.Open(tmpfilename) srs = ds.GetSpatialRef() assert srs.GetAuthorityCode('PROJCS') == '26711' assert ds.GetGeoTransform() == (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetMinimum() == 74.0 assert ds.GetRasterBand(1).GetMaximum() == 255.0 ds = None gdal.GetDriverByName('BAG').Delete(tmpfilename) ############################################################################### # def test_bag_write_single_band_create_two_bands(): tmpfilename = '/vsimem/out.bag' gdal.Warp(tmpfilename, 'data/bag/test_vr.bag', options='-co BLOCK_SIZE=2 -co VAR_XML_IDENTIFICATION_CITATION=') ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).Checksum() == 65529 assert ds.GetRasterBand(2).Checksum() == 60 xml = ds.GetMetadata_List('xml:BAG')[0] assert '' in xml ds = None gdal.GetDriverByName('BAG').Delete(tmpfilename) ############################################################################### # def test_bag_read_tracking_list(): ds = ogr.Open('data/bag/test_georef_metadata.bag') assert ds is not None assert ds.GetLayerCount() == 1 assert ds.GetLayer(1) is None lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 lyr.ResetReading() f = lyr.GetNextFeature() assert f['row'] == 0 assert f['col'] == 1 assert f['depth'] == 2.5 assert f['uncertainty'] == 3.5 assert f['track_code'] == 4 assert f['list_series'] == 5 f = lyr.GetNextFeature() assert f['row'] == 6 assert f['col'] == 7 assert f['depth'] == 8.5 assert f['uncertainty'] == 9.5 assert f['track_code'] == 10 assert f['list_series'] == 11 gdalautotest-3.2.2/gdrivers/eedai.py0000775000175000017500000010500714020414370016143 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: eedai.py 1e3b25ad86c95335304e56a74b7409975fe2928d 2020-10-30 10:42:35 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Earth Engine Data API Images driver test suite. # Author: Even Rouault, even dot rouault at spatialys.com # ############################################################################### # Copyright (c) 2017, Planet Labs # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import json import struct import sys from osgeo import gdal import gdaltest import webserver import pytest ############################################################################### # Find EEDAI driver def test_eedai_1(): gdaltest.eedai_drv = gdal.GetDriverByName('EEDAI') if gdaltest.eedai_drv is None: pytest.skip() gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdaltest.EEDA_BEARER = gdal.GetConfigOption('EEDA_BEARER') gdaltest.EEDA_URL = gdal.GetConfigOption('EEDA_URL') gdaltest.EEDA_PRIVATE_KEY = gdal.GetConfigOption('EEDA_PRIVATE_KEY') gdaltest.EEDA_CLIENT_EMAIL = gdal.GetConfigOption('EEDA_CLIENT_EMAIL') gdaltest.GOOGLE_APPLICATION_CREDENTIALS = gdal.GetConfigOption('GOOGLE_APPLICATION_CREDENTIALS') gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', '') ############################################################################### # Nominal case def test_eedai_2(): if gdaltest.eedai_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/image', json.dumps({ 'type': 'IMAGE', 'properties': { 'foo': 'bar', 'prop_B9': 'the_prop_B9', 'prop_BAND_2': 'the_prop_B2' }, 'bands': [ { "id": "B1", "dataType": { "precision": "INT", "range": { "max": 65535 } }, "grid": { "crsCode": "EPSG:32610", "affineTransform": { "translateX": 499980, "translateY": 4200000, "scaleX": 60, "scaleY": -60 }, "dimensions": { "width": 1830, "height": 1831 } } }, { "id": "B2", "dataType": { "precision": "INT", "range": { "max": 65535 } }, "grid": { "crsCode": "EPSG:32610", "affineTransform": { "translateX": 499980, "translateY": 4200000, "scaleX": 60, "scaleY": -60 }, "dimensions": { "width": 10980, "height": 10981 } } }, { "id": "B9", "dataType": { "precision": "INT", "range": { "max": 65535 } }, "grid": { "crsCode": "EPSG:32610", "affineTransform": { "translateX": 499980, "translateY": 4200000, "scaleX": 60, "scaleY": -60 }, "dimensions": { "width": 1830, "height": 1831 } } }, ] })) # To please the unregistering of the persistent connection gdal.FileFromMemBuffer('/vsimem/ee/', '') gdal.SetConfigOption('EEDA_BEARER', 'mybearer') gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') ds = gdal.OpenEx('EEDAI:image', open_options=['PIXEL_ENCODING=NPY']) gdal.SetConfigOption('EEDA_URL', None) expected_info = { "metadata": { "": { "foo": "bar" }, "SUBDATASETS": { "SUBDATASET_1_DESC": "Bands B1,B9 of image", "SUBDATASET_2_DESC": "Band B2 of image", "SUBDATASET_2_NAME": "EEDAI:image:B2", "SUBDATASET_1_NAME": "EEDAI:image:B1,B9" }, "IMAGE_STRUCTURE": { "INTERLEAVE": "PIXEL" } }, "size": [ 1830, 1831 ], "driverLongName": "Earth Engine Data API Image", "bands": [ { "colorInterpretation": "Undefined", "block": [ 256, 256 ], "metadata": {}, "band": 1, "description": "B1", "type": "UInt16", "overviews": [ { "size": [ 915, 915 ] }, { "size": [ 457, 457 ] }, { "size": [ 228, 228 ] } ] }, { "colorInterpretation": "Undefined", "block": [ 256, 256 ], "metadata": { "": { "prop": "the_prop_B9" } }, "band": 2, "description": "B9", "type": "UInt16", "overviews": [ { "size": [ 915, 915 ] }, { "size": [ 457, 457 ] }, { "size": [ 228, 228 ] } ] } ], "cornerCoordinates": { "center": [ 554880.0, 4145070.0 ], "upperRight": [ 609780.0, 4200000.0 ], "lowerLeft": [ 499980.0, 4090140.0 ], "lowerRight": [ 609780.0, 4090140.0 ], "upperLeft": [ 499980.0, 4200000.0 ] }, "files": [], "description": "EEDAI:image", "geoTransform": [ 499980.0, 60.0, 0.0, 4200000.0, 0.0, -60.0 ] } info = gdal.Info(ds, format='json') for key in expected_info: if not (key in info and info[key] == expected_info[key]): if key in info: print('Got: ' + str(info[key])) else: print('Does not exist in got info') print('Expected: ' + str(expected_info[key])) print('Whole info:') print(json.dumps(info, indent=4)) pytest.fail('Got difference for key %s' % key) assert ds.GetProjectionRef().find('32610') >= 0 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(3) is None npy_serialized = struct.pack( 'B' * 8, 0x93, ord('N'), ord('U'), ord('M'), ord('P'), ord('Y'), 1, 0) descr = "{'descr': [('B1', '= 0: pytest.skip() assert ds is not None ############################################################################### # Test OAuth2 with GOOGLE_APPLICATION_CREDENTIALS def test_eedai_GOOGLE_APPLICATION_CREDENTIALS(): if gdaltest.eedai_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/my.json', """{ "private_key":"-----BEGIN PRIVATE KEY----- MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOlwJQLLDG1HeLrk\n VNcFR5Qptto/rJE5emRuy0YmkVINT4uHb1be7OOo44C2Ev8QPVtNHHS2XwCY5gTm\n i2RfIBLv+VDMoVQPqqE0LHb0WeqGmM5V1tHbmVnIkCcKMn3HpK30grccuBc472LQ\n DVkkGqIiGu0qLAQ89JP/r0LWWySRAgMBAAECgYAWjsS00WRBByAOh1P/dz4kfidy\n TabiXbiLDf3MqJtwX2Lpa8wBjAc+NKrPXEjXpv0W3ou6Z4kkqKHJpXGg4GRb4N5I\n 2FA+7T1lA0FCXa7dT2jvgJLgpBepJu5b//tqFqORb4A4gMZw0CiPN3sUsWsSw5Hd\n DrRXwp6sarzG77kvZQJBAPgysAmmXIIp9j1hrFSkctk4GPkOzZ3bxKt2Nl4GFrb+\n bpKSon6OIhP1edrxTz1SMD1k5FiAAVUrMDKSarbh5osCQQDwxq4Tvf/HiYz79JBg\n Wz5D51ySkbg01dOVgFW3eaYAdB6ta/o4vpHhnbrfl6VO9oUb3QR4hcrruwnDHsw3\n 4mDTAkEA9FPZjbZSTOSH/cbgAXbdhE4/7zWOXj7Q7UVyob52r+/p46osAk9i5qj5\n Kvnv2lrFGDrwutpP9YqNaMtP9/aLnwJBALLWf9n+GAv3qRZD0zEe1KLPKD1dqvrj\n j+LNjd1Xp+tSVK7vMs4PDoAMDg+hrZF3HetSQM3cYpqxNFEPgRRJOy0CQQDQlZHI\n yzpSgEiyx8O3EK1iTidvnLXbtWabvjZFfIE/0OhfBmN225MtKG3YLV2HoUvpajLq\n gwE6fxOLyJDxuWRf\n -----END PRIVATE KEY-----", "client_email":"my@email.com" }""") gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', '/vsimem/my.json') gdal.SetConfigOption('EEDA_PRIVATE_KEY', None) gdal.SetConfigOption('EEDA_CLIENT_EMAIL', None) gdal.SetConfigOption('GO2A_AUD', '/vsimem/oauth2/v4/token') gdal.SetConfigOption('GOA2_NOW', '123456') gdal.FileFromMemBuffer('/vsimem/oauth2/v4/token&POSTFIELDS=grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAibXlAZW1haWwuY29tIiwgInNjb3BlIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvZWFydGhlbmdpbmUucmVhZG9ubHkiLCAiYXVkIjogIi92c2ltZW0vb2F1dGgyL3Y0L3Rva2VuIiwgImlhdCI6IDEyMzQ1NiwgImV4cCI6IDEyNzA1Nn0%3D.1W564xcQESVsqZmBEIMzj4rr0RuGa4RiUPZp5H%2FNENN9V9oPSTdacw%2BMiu3pcFf9AJv8wj0ajUeRsgTmvSicAftER49xeCQYUrs6uV122FGVsxml26kMFacNsCgRad%2Fy7xCAhMPfRJsqxS2%2BB392ssBeEzTGCSI6W3AsJg64OfA%3D', '{ "access_token": "my_token", "token_type": "Bearer", "expires_in": 3600 }') ds = gdal.Open('EEDAI:image') gdal.Unlink('/vsimem/my.json') gdal.SetConfigOption('EEDA_URL', None) gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', None) gdal.SetConfigOption('EEDA_PRIVATE_KEY', None) gdal.SetConfigOption('EEDA_CLIENT_EMAIL', None) if gdal.GetLastErrorMsg().find('CPLRSASHA256Sign() not implemented') >= 0: pytest.skip() if ds is None and gdaltest.is_github_workflow_mac(): print(gdal.GetLastErrorMsg()) pytest.xfail('Failure. See https://github.com/rouault/gdal/runs/1329425333?check_suite_focus=true') assert ds is not None ############################################################################### # Read credentials from simulated GCE instance def test_eedai_gce_credentials(): if gdaltest.eedai_drv is None: pytest.skip() if sys.platform not in ('linux', 'linux2', 'win32'): pytest.skip() gdaltest.webserver_process = None gdaltest.webserver_port = 0 if not gdaltest.built_against_curl(): pytest.skip() (gdaltest.webserver_process, gdaltest.webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('CPL_GCE_CREDENTIALS_URL', 'http://localhost:%d/computeMetadata/v1/instance/service-accounts/default/token' % gdaltest.webserver_port) # Disable hypervisor related check to test if we are really on EC2 gdal.SetConfigOption('CPL_GCE_CHECK_LOCAL_FILES', 'NO') gdal.VSICurlClearCache() def method(request): if 'Authorization' not in request.headers: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return expected_authorization = 'Bearer ACCESS_TOKEN' if request.headers['Authorization'] != expected_authorization: sys.stderr.write("Bad Authorization: '%s'\n" % str(request.headers['Authorization'])) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.end_headers() request.wfile.write("""foo""".encode('ascii')) handler = webserver.SequentialHandler() handler.add('GET', '/computeMetadata/v1/instance/service-accounts/default/token', 200, {}, """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 3600, }""") with webserver.install_http_handler(handler): gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') ds = gdal.Open('EEDAI:image') gdal.SetConfigOption('EEDA_URL', None) gdal.SetConfigOption('CPL_GCE_CREDENTIALS_URL', None) gdal.SetConfigOption('CPL_GCE_CHECK_LOCAL_FILES', None) webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) assert ds is not None ############################################################################### # Request in PNG mode def test_eedai_4(): if gdaltest.eedai_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/image', json.dumps({ 'type': 'IMAGE', 'bands': [ { "id": "B1", "dataType": { "precision": "INT", "range": { "max": 255 } }, "grid": { "crsCode": "EPSG:32610", "affineTransform": { "translateX": 499980, "translateY": 4200000, "scaleX": 60, "scaleY": -60 }, "dimensions": { "width": 1830, "height": 1831 } } }, { "id": "B2", "dataType": { "precision": "INT", "range": { "max": 255 } }, "grid": { "crsCode": "EPSG:32610", "affineTransform": { "translateX": 499980, "translateY": 4200000, "scaleX": 60, "scaleY": -60 }, "dimensions": { "width": 1830, "height": 1831 } } }, { "id": "B3", "dataType": { "precision": "INT", "range": { "max": 255 } }, "grid": { "crsCode": "EPSG:32610", "affineTransform": { "translateX": 499980, "translateY": 4200000, "scaleX": 60, "scaleY": -60 }, "dimensions": { "width": 1830, "height": 1831 } } } ] })) gdal.SetConfigOption('EEDA_BEARER', 'mybearer') gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') ds = gdal.Open('EEDAI:image') gdal.SetConfigOption('EEDA_URL', None) mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 3) mem_ds.GetRasterBand(1).Fill(127) mem_ds.GetRasterBand(2).Fill(128) mem_ds.GetRasterBand(3).Fill(129) gdal.GetDriverByName('PNG').CreateCopy('/vsimem/out.png', mem_ds) f = gdal.VSIFOpenL('/vsimem/out.png', 'rb') png_data = gdal.VSIFReadL(1, 1000000, f) gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/out.png') gdal.FileFromMemBuffer( '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "PNG", "bandIds": [ "B1", "B2", "B3" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 60.0, "scaleY": -60.0, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', png_data) got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) got_data = struct.unpack('B', got_data)[0] assert got_data == 127 # Same with dataset RasterIO got_data = ds.ReadRaster(0, 0, 1, 1) got_data = struct.unpack('B' * 3, got_data) assert got_data == (127, 128, 129) # Same after flushing cache ds.FlushCache() got_data = ds.ReadRaster(0, 0, 1, 1) got_data = struct.unpack('B' * 3, got_data) assert got_data == (127, 128, 129) # Sub-sampled query gdal.FileFromMemBuffer( '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "PNG", "bandIds": [ "B1", "B2", "B3" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 120.0, "scaleY": -120.06557377049181, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', png_data) got_data = ds.GetRasterBand(1).ReadRaster( 0, 0, 2, 2, buf_xsize=1, buf_ysize=1) got_data = struct.unpack('B', got_data)[0] assert got_data == 127 # Same after flushing cache with dataset RasterIO ds.FlushCache() got_data = ds.ReadRaster(0, 0, 2, 2, buf_xsize=1, buf_ysize=1) got_data = struct.unpack('B' * 3, got_data) assert got_data == (127, 128, 129) ds = None gdal.SetConfigOption('EEDA_BEARER', None) ############################################################################### # Request in AUTO GTIFF mode def test_eedai_geotiff(): if gdaltest.eedai_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/image', json.dumps({ 'type': 'IMAGE', 'bands': [ { "id": "B1", "dataType": { "precision": "INT", "range": { "max": 65535 } }, "grid": { "crsCode": "EPSG:32610", "affineTransform": { "translateX": 499980, "translateY": 4200000, "scaleX": 60, "scaleY": -60 }, "dimensions": { "width": 1830, "height": 1831 } } } ] })) gdal.SetConfigOption('EEDA_BEARER', 'mybearer') gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') ds = gdal.Open('EEDAI:image') gdal.SetConfigOption('EEDA_URL', None) mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, 1, gdal.GDT_UInt16) mem_ds.GetRasterBand(1).Fill(12345) gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', mem_ds) f = gdal.VSIFOpenL('/vsimem/out.tif', 'rb') data = gdal.VSIFReadL(1, 1000000, f) gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/out.tif') gdal.FileFromMemBuffer( '/vsimem/ee/projects/earthengine-public/assets/image:getPixels&CUSTOMREQUEST=POST&POSTFIELDS={ "fileFormat": "GEO_TIFF", "bandIds": [ "B1" ], "grid": { "affineTransform": { "translateX": 499980.0, "translateY": 4200000.0, "scaleX": 60.0, "scaleY": -60.0, "shearX": 0.0, "shearY": 0.0 }, "dimensions": { "width": 256, "height": 256 } } }', data) got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) got_data = struct.unpack('H', got_data)[0] assert got_data == 12345 ds = None gdal.SetConfigOption('EEDA_BEARER', None) ############################################################################### # def test_eedai_cleanup(): if gdaltest.eedai_drv is None: pytest.skip() gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) gdal.SetConfigOption('EEDA_BEARER', gdaltest.EEDA_BEARER) gdal.SetConfigOption('EEDA_URL', gdaltest.EEDA_URL) gdal.SetConfigOption('EEDA_PRIVATE_KEY', gdaltest.EEDA_PRIVATE_KEY) gdal.SetConfigOption('EEDA_CLIENT_EMAIL', gdaltest.EEDA_CLIENT_EMAIL) gdal.SetConfigOption('GO2A_AUD', None) gdal.SetConfigOption('GOA2_NOW', None) gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', gdaltest.GOOGLE_APPLICATION_CREDENTIALS) gdal.Unlink('/vsimem/ee/projects/earthengine-public/assets/image') gdal.RmdirRecursive('/vsimem/ee/') ############################################################################### # def test_eedai_real_service(): if gdaltest.eedai_drv is None: pytest.skip() if gdal.GetConfigOption('GOOGLE_APPLICATION_CREDENTIALS') is None: if gdal.GetConfigOption('EEDA_PRIVATE_KEY_FILE') is None and gdal.GetConfigOption('EEDA_PRIVATE_KEY') is None: pytest.skip('Missing EEDA_PRIVATE_KEY_FILE/EEDA_PRIVATE_KEY or GOOGLE_APPLICATION_CREDENTIALS') if gdal.GetConfigOption('EEDA_CLIENT_EMAIL') is None: pytest.skip('Missing EEDA_CLIENT_EMAIL') ds = gdal.Open('EEDAI:USDA/NAIP/DOQQ/n_4010064_se_14_2_20070725') assert ds is not None res = gdal.Info(ds, format='json') expected = {'files': [], 'cornerCoordinates': {'upperRight': [415016.0, 4435536.0], 'lowerLeft': [408970.0, 4427936.0], 'lowerRight': [415016.0, 4427936.0], 'upperLeft': [408970.0, 4435536.0], 'center': [411993.0, 4431736.0]}, 'wgs84Extent': {'type': 'Polygon', 'coordinates': [[[-100.067433, 40.0651671], [-100.0663662, 39.9967049], [-99.9955511, 39.9973349], [-99.9965471, 40.0657986], [-100.067433, 40.0651671]]]}, 'description': 'EEDAI:USDA/NAIP/DOQQ/n_4010064_se_14_2_20070725', 'driverShortName': 'EEDAI', 'driverLongName': 'Earth Engine Data API Image', 'bands': [{'description': 'R', 'band': 1, 'colorInterpretation': 'Red', 'overviews': [{'size': [1511, 1900]}, {'size': [755, 950]}, {'size': [377, 475]}, {'size': [188, 237]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}, {'description': 'G', 'band': 2, 'colorInterpretation': 'Green', 'overviews': [{'size': [1511, 1900]}, {'size': [755, 950]}, {'size': [377, 475]}, {'size': [188, 237]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}, {'description': 'B', 'band': 3, 'colorInterpretation': 'Blue', 'overviews': [{'size': [1511, 1900]}, {'size': [755, 950]}, {'size': [377, 475]}, {'size': [188, 237]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}], 'coordinateSystem': {'wkt': 'PROJCS["NAD83 / UTM zone 14N",\n GEOGCS["NAD83",\n DATUM["North_American_Datum_1983",\n SPHEROID["GRS 1980",6378137,298.257222101,\n AUTHORITY["EPSG","7019"]],\n TOWGS84[0,0,0,0,0,0,0],\n AUTHORITY["EPSG","6269"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.0174532925199433,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4269"]],\n PROJECTION["Transverse_Mercator"],\n PARAMETER["latitude_of_origin",0],\n PARAMETER["central_meridian",-99],\n PARAMETER["scale_factor",0.9996],\n PARAMETER["false_easting",500000],\n PARAMETER["false_northing",0],\n UNIT["metre",1,\n AUTHORITY["EPSG","9001"]],\n AXIS["Easting",EAST],\n AXIS["Northing",NORTH],\n AUTHORITY["EPSG","26914"]]'}, 'geoTransform': [408970.0, 2.0, 0.0, 4435536.0, 0.0, -2.0], 'metadata': {'IMAGE_STRUCTURE': {'INTERLEAVE': 'PIXEL'}}, 'size': [3023, 3800]} assert expected == res assert ds.ReadRaster(0, 0, 1, 1) is not None ds = gdal.Open('EEDAI:MODIS/006/MYD09GA/2017_05_24') assert ds is not None res = gdal.Info(ds, format='json') expected = {'files': [], 'cornerCoordinates': {'upperRight': [20015109.354, 10007554.677], 'lowerLeft': [-20015109.354, -10007554.677], 'lowerRight': [20015109.354, -10007554.677], 'upperLeft': [-20015109.354, 10007554.677], 'center': [9.6e-06, 6e-06]}, 'wgs84Extent': {'type': 'Polygon', 'coordinates': [[]]}, 'description': 'EEDAI:MODIS/006/MYD09GA/2017_05_24', 'driverShortName': 'EEDAI', 'driverLongName': 'Earth Engine Data API Image', 'bands': [{'description': 'num_observations_1km', 'band': 1, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {'IMAGE_STRUCTURE': {'PIXELTYPE': 'SIGNEDBYTE'}}}, {'description': 'state_1km', 'band': 2, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'UInt16', 'block': [256, 256], 'metadata': {}}, {'description': 'SensorZenith', 'band': 3, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'SensorAzimuth', 'band': 4, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'Range', 'band': 5, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'UInt16', 'block': [256, 256], 'metadata': {}}, {'description': 'SolarZenith', 'band': 6, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'SolarAzimuth', 'band': 7, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Int16', 'block': [256, 256], 'metadata': {}}, {'description': 'gflags', 'band': 8, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}, {'description': 'orbit_pnt', 'band': 9, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {'IMAGE_STRUCTURE': {'PIXELTYPE': 'SIGNEDBYTE'}}}, {'description': 'granule_pnt', 'band': 10, 'colorInterpretation': 'Undefined', 'overviews': [{'size': [21600, 10800]}, {'size': [10800, 5400]}, {'size': [5400, 2700]}, {'size': [2700, 1350]}, {'size': [1350, 675]}, {'size': [675, 337]}, {'size': [337, 168]}, {'size': [168, 84]}], 'type': 'Byte', 'block': [256, 256], 'metadata': {}}], 'coordinateSystem': {'wkt': 'PROJCS["MODIS Sinusoidal",\n GEOGCS["WGS 84",\n DATUM["WGS_1984",\n SPHEROID["WGS 84",6378137,298.257223563,\n AUTHORITY["EPSG","7030"]],\n AUTHORITY["EPSG","6326"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.01745329251994328,\n AUTHORITY["EPSG","9122"]],\n AUTHORITY["EPSG","4326"]],\n PROJECTION["Sinusoidal"],\n PARAMETER["false_easting",0.0],\n PARAMETER["false_northing",0.0],\n PARAMETER["central_meridian",0.0],\n PARAMETER["semi_major",6371007.181],\n PARAMETER["semi_minor",6371007.181],\n UNIT["m",1.0],\n AUTHORITY["SR-ORG","6974"]]'}, 'geoTransform': [-20015109.354, 926.625433056, 0.0, 10007554.677, 0.0, -926.625433055], 'metadata': {'IMAGE_STRUCTURE': {'INTERLEAVE': 'PIXEL'}, 'SUBDATASETS': {'SUBDATASET_2_NAME': 'EEDAI:MODIS/006/MYD09GA/2017_05_24:num_observations_500m,sur_refl_b01,sur_refl_b02,sur_refl_b03,sur_refl_b04,sur_refl_b05,sur_refl_b06,sur_refl_b07,QC_500m,obscov_500m,iobs_res,q_scan', 'SUBDATASET_2_DESC': 'Bands num_observations_500m,sur_refl_b01,sur_refl_b02,sur_refl_b03,sur_refl_b04,sur_refl_b05,sur_refl_b06,sur_refl_b07,QC_500m,obscov_500m,iobs_res,q_scan of MODIS/006/MYD09GA/2017_05_24', 'SUBDATASET_1_NAME': 'EEDAI:MODIS/006/MYD09GA/2017_05_24:num_observations_1km,state_1km,SensorZenith,SensorAzimuth,Range,SolarZenith,SolarAzimuth,gflags,orbit_pnt,granule_pnt', 'SUBDATASET_1_DESC': 'Bands num_observations_1km,state_1km,SensorZenith,SensorAzimuth,Range,SolarZenith,SolarAzimuth,gflags,orbit_pnt,granule_pnt of MODIS/006/MYD09GA/2017_05_24'}}, 'size': [43200, 21600]} assert expected == res assert ds.ReadRaster(0, 0, 1, 1) is not None gdalautotest-3.2.2/gdrivers/l1b.py0000775000175000017500000003106714020414370015556 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: l1b.py 9c4a297672b2e98e1a5e37fb4f5ac0004d2e61e8 2020-05-10 17:53:23 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for L1B driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import pytest from osgeo import gdal import gdaltest ############################################################################### # l1b_list = [ ('http://download.osgeo.org/gdal/data/l1b', 'n12gac8bit.l1b', 51754, -1, 1938), ('http://download.osgeo.org/gdal/data/l1b', 'n12gac10bit.l1b', 46039, -1, 1887), ('http://download.osgeo.org/gdal/data/l1b', 'n12gac10bit_ebcdic.l1b', 46039, -1, 1887), # 2848 ('http://download.osgeo.org/gdal/data/l1b', 'n14gac16bit.l1b', 42286, -1, 2142), ('http://download.osgeo.org/gdal/data/l1b', 'n15gac8bit.l1b', 55772, -1, 2091), ('http://download.osgeo.org/gdal/data/l1b', 'n16gac10bit.l1b', 6749, -1, 2142), ('http://download.osgeo.org/gdal/data/l1b', 'n17gac16bit.l1b', 61561, -1, 2040), ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'frang.1b', 33700, 30000, 357), # 10 bit guess ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'franh.1b', 56702, 100000, 255), # 10 bit guess ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'calfirel.1b', 55071, 30000, 255), # 16 bit guess ('http://www.ncdc.noaa.gov/oa/pod-guide/ncdc/docs/podug/data/avhrr', 'rapnzg.1b', 58084, 30000, 612), # 16 bit guess ('http://www.sat.dundee.ac.uk/testdata/new_noaa/new_klm_format/', 'noaa18.n1b', 50229, 50000, 102), ('http://www.sat.dundee.ac.uk/testdata/metop', 'noaa1b', 62411, 150000, 408) ] @pytest.mark.parametrize( 'downloadURL,fileName,checksum,download_size,gcpNumber', l1b_list, ids=[item[1] for item in l1b_list] ) def test_l1b(downloadURL, fileName, checksum, download_size, gcpNumber): if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): pytest.skip() ds = gdal.Open('tmp/cache/' + fileName) assert ds.GetRasterBand(1).Checksum() == checksum assert len(ds.GetGCPs()) == gcpNumber def test_l1b_geoloc(): try: os.stat('tmp/cache/n12gac8bit.l1b') except OSError: pytest.skip() ds = gdal.Open('tmp/cache/n12gac8bit.l1b') md = ds.GetMetadata('GEOLOCATION') expected_md = { 'LINE_OFFSET': '0', 'LINE_STEP': '1', 'PIXEL_OFFSET': '0', 'PIXEL_STEP': '1', 'X_BAND': '1', 'X_DATASET': 'L1BGCPS_INTERPOL:"tmp/cache/n12gac8bit.l1b"', 'Y_BAND': '2', 'Y_DATASET': 'L1BGCPS_INTERPOL:"tmp/cache/n12gac8bit.l1b"'} for key in expected_md: assert md[key] == expected_md[key] ds = None ds = gdal.Open('L1BGCPS_INTERPOL:"tmp/cache/n12gac8bit.l1b"') cs = ds.GetRasterBand(1).Checksum() assert cs == 62397 cs = ds.GetRasterBand(2).Checksum() assert cs == 52616 ############################################################################### # def test_l1b_solar_zenith_angles_before_noaa_15(): try: os.stat('tmp/cache/n12gac10bit.l1b') except OSError: pytest.skip() ds = gdal.Open('tmp/cache/n12gac10bit.l1b') md = ds.GetMetadata('SUBDATASETS') expected_md = { 'SUBDATASET_1_NAME': 'L1B_SOLAR_ZENITH_ANGLES:"tmp/cache/n12gac10bit.l1b"', 'SUBDATASET_1_DESC': 'Solar zenith angles' } for key in expected_md: assert md[key] == expected_md[key] ds = None ds = gdal.Open('L1B_SOLAR_ZENITH_ANGLES:"tmp/cache/n12gac10bit.l1b"') cs = ds.GetRasterBand(1).Checksum() assert cs == 22924 ############################################################################### # def test_l1b_metadata_before_noaa_15(): try: os.stat('tmp/cache/n12gac10bit.l1b') except OSError: pytest.skip() gdal.SetConfigOption('L1B_FETCH_METADATA', 'YES') gdal.SetConfigOption('L1B_METADATA_DIRECTORY', 'tmp') ds = gdal.Open('tmp/cache/n12gac10bit.l1b') gdal.SetConfigOption('L1B_FETCH_METADATA', None) gdal.SetConfigOption('L1B_METADATA_DIRECTORY', None) del ds f = open('tmp/n12gac10bit.l1b_metadata.csv', 'rb') ln = f.readline().decode('ascii') assert ln == 'SCANLINE,NBLOCKYOFF,YEAR,DAY,MS_IN_DAY,FATAL_FLAG,TIME_ERROR,DATA_GAP,DATA_JITTER,INSUFFICIENT_DATA_FOR_CAL,NO_EARTH_LOCATION,DESCEND,P_N_STATUS,BIT_SYNC_STATUS,SYNC_ERROR,FRAME_SYNC_ERROR,FLYWHEELING,BIT_SLIPPAGE,C3_SBBC,C4_SBBC,C5_SBBC,TIP_PARITY_FRAME_1,TIP_PARITY_FRAME_2,TIP_PARITY_FRAME_3,TIP_PARITY_FRAME_4,TIP_PARITY_FRAME_5,SYNC_ERRORS,CAL_SLOPE_C1,CAL_INTERCEPT_C1,CAL_SLOPE_C2,CAL_INTERCEPT_C2,CAL_SLOPE_C3,CAL_INTERCEPT_C3,CAL_SLOPE_C4,CAL_INTERCEPT_C4,CAL_SLOPE_C5,CAL_INTERCEPT_C5,NUM_SOLZENANGLES_EARTHLOCPNTS\n' ln = f.readline().decode('ascii') assert ln == '3387,0,1998,84,16966146,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.102000,-4.130000,0.103000,-4.210000,-0.001677,1.667438,-0.157728,156.939636,-0.179833,179.775742,51\n' f.close() os.unlink('tmp/n12gac10bit.l1b_metadata.csv') ############################################################################### # def test_l1b_angles_after_noaa_15(): try: os.stat('tmp/cache/n16gac10bit.l1b') except OSError: pytest.skip() ds = gdal.Open('tmp/cache/n16gac10bit.l1b') md = ds.GetMetadata('SUBDATASETS') expected_md = { 'SUBDATASET_1_NAME': 'L1B_ANGLES:"tmp/cache/n16gac10bit.l1b"', 'SUBDATASET_1_DESC': 'Solar zenith angles, satellite zenith angles and relative azimuth angles' } for key in expected_md: assert md[key] == expected_md[key] ds = None ds = gdal.Open('L1B_ANGLES:"tmp/cache/n16gac10bit.l1b"') cs = ds.GetRasterBand(1).Checksum() assert cs == 31487 cs = ds.GetRasterBand(2).Checksum() assert cs == 23380 cs = ds.GetRasterBand(3).Checksum() assert cs == 64989 ############################################################################### # def test_l1b_clouds_after_noaa_15(): try: os.stat('tmp/cache/n16gac10bit.l1b') except OSError: pytest.skip() ds = gdal.Open('tmp/cache/n16gac10bit.l1b') md = ds.GetMetadata('SUBDATASETS') expected_md = { 'SUBDATASET_2_NAME': 'L1B_CLOUDS:"tmp/cache/n16gac10bit.l1b"', 'SUBDATASET_2_DESC': 'Clouds from AVHRR (CLAVR)' } for key in expected_md: assert md[key] == expected_md[key] ds = None ds = gdal.Open('L1B_CLOUDS:"tmp/cache/n16gac10bit.l1b"') cs = ds.GetRasterBand(1).Checksum() assert cs == 0 ############################################################################### # def test_l1b_metadata_after_noaa_15(): try: os.stat('tmp/cache/n16gac10bit.l1b') except OSError: pytest.skip() gdal.SetConfigOption('L1B_FETCH_METADATA', 'YES') gdal.SetConfigOption('L1B_METADATA_DIRECTORY', 'tmp') ds = gdal.Open('tmp/cache/n16gac10bit.l1b') gdal.SetConfigOption('L1B_FETCH_METADATA', None) gdal.SetConfigOption('L1B_METADATA_DIRECTORY', None) del ds f = open('tmp/n16gac10bit.l1b_metadata.csv', 'rb') ln = f.readline().decode('ascii') assert ln == 'SCANLINE,NBLOCKYOFF,YEAR,DAY,MS_IN_DAY,SAT_CLOCK_DRIF_DELTA,SOUTHBOUND,SCANTIME_CORRECTED,C3_SELECT,FATAL_FLAG,TIME_ERROR,DATA_GAP,INSUFFICIENT_DATA_FOR_CAL,NO_EARTH_LOCATION,FIRST_GOOD_TIME_AFTER_CLOCK_UPDATE,INSTRUMENT_STATUS_CHANGED,SYNC_LOCK_DROPPED,FRAME_SYNC_ERROR,FRAME_SYNC_DROPPED_LOCK,FLYWHEELING,BIT_SLIPPAGE,TIP_PARITY_ERROR,REFLECTED_SUNLIGHT_C3B,REFLECTED_SUNLIGHT_C4,REFLECTED_SUNLIGHT_C5,RESYNC,P_N_STATUS,BAD_TIME_CAN_BE_INFERRED,BAD_TIME_CANNOT_BE_INFERRED,TIME_DISCONTINUITY,REPEAT_SCAN_TIME,UNCALIBRATED_BAD_TIME,CALIBRATED_FEWER_SCANLINES,UNCALIBRATED_BAD_PRT,CALIBRATED_MARGINAL_PRT,UNCALIBRATED_CHANNELS,NO_EARTH_LOC_BAD_TIME,EARTH_LOC_QUESTIONABLE_TIME,EARTH_LOC_QUESTIONABLE,EARTH_LOC_VERY_QUESTIONABLE,C3B_UNCALIBRATED,C3B_QUESTIONABLE,C3B_ALL_BLACKBODY,C3B_ALL_SPACEVIEW,C3B_MARGINAL_BLACKBODY,C3B_MARGINAL_SPACEVIEW,C4_UNCALIBRATED,C4_QUESTIONABLE,C4_ALL_BLACKBODY,C4_ALL_SPACEVIEW,C4_MARGINAL_BLACKBODY,C4_MARGINAL_SPACEVIEW,C5_UNCALIBRATED,C5_QUESTIONABLE,C5_ALL_BLACKBODY,C5_ALL_SPACEVIEW,C5_MARGINAL_BLACKBODY,C5_MARGINAL_SPACEVIEW,BIT_ERRORS,VIS_OP_CAL_C1_SLOPE_1,VIS_OP_CAL_C1_INTERCEPT_1,VIS_OP_CAL_C1_SLOPE_2,VIS_OP_CAL_C1_INTERCEPT_2,VIS_OP_CAL_C1_INTERSECTION,VIS_TEST_CAL_C1_SLOPE_1,VIS_TEST_CAL_C1_INTERCEPT_1,VIS_TEST_CAL_C1_SLOPE_2,VIS_TEST_CAL_C1_INTERCEPT_2,VIS_TEST_CAL_C1_INTERSECTION,VIS_PRELAUNCH_CAL_C1_SLOPE_1,VIS_PRELAUNCH_CAL_C1_INTERCEPT_1,VIS_PRELAUNCH_CAL_C1_SLOPE_2,VIS_PRELAUNCH_CAL_C1_INTERCEPT_2,VIS_PRELAUNCH_CAL_C1_INTERSECTION,VIS_OP_CAL_C2_SLOPE_1,VIS_OP_CAL_C2_INTERCEPT_1,VIS_OP_CAL_C2_SLOPE_2,VIS_OP_CAL_C2_INTERCEPT_2,VIS_OP_CAL_C2_INTERSECTION,VIS_TEST_CAL_C2_SLOPE_1,VIS_TEST_CAL_C2_INTERCEPT_1,VIS_TEST_CAL_C2_SLOPE_2,VIS_TEST_CAL_C2_INTERCEPT_2,VIS_TEST_CAL_C2_INTERSECTION,VIS_PRELAUNCH_CAL_C2_SLOPE_1,VIS_PRELAUNCH_CAL_C2_INTERCEPT_1,VIS_PRELAUNCH_CAL_C2_SLOPE_2,VIS_PRELAUNCH_CAL_C2_INTERCEPT_2,VIS_PRELAUNCH_CAL_C2_INTERSECTION,VIS_OP_CAL_C3A_SLOPE_1,VIS_OP_CAL_C3A_INTERCEPT_1,VIS_OP_CAL_C3A_SLOPE_2,VIS_OP_CAL_C3A_INTERCEPT_2,VIS_OP_CAL_C3A_INTERSECTION,VIS_TEST_CAL_C3A_SLOPE_1,VIS_TEST_CAL_C3A_INTERCEPT_1,VIS_TEST_CAL_C3A_SLOPE_2,VIS_TEST_CAL_C3A_INTERCEPT_2,VIS_TEST_CAL_C3A_INTERSECTION,VIS_PRELAUNCH_CAL_C3A_SLOPE_1,VIS_PRELAUNCH_CAL_C3A_INTERCEPT_1,VIS_PRELAUNCH_CAL_C3A_SLOPE_2,VIS_PRELAUNCH_CAL_C3A_INTERCEPT_2,VIS_PRELAUNCH_CAL_C3A_INTERSECTION,IR_OP_CAL_C3B_COEFF_1,IR_OP_CAL_C3B_COEFF_2,IR_OP_CAL_C3B_COEFF_3,IR_TEST_CAL_C3B_COEFF_1,IR_TEST_CAL_C3B_COEFF_2,IR_TEST_CAL_C3B_COEFF_3,IR_OP_CAL_C4_COEFF_1,IR_OP_CAL_C4_COEFF_2,IR_OP_CAL_C4_COEFF_3,IR_TEST_CAL_C4_COEFF_1,IR_TEST_CAL_C4_COEFF_2,IR_TEST_CAL_C4_COEFF_3,IR_OP_CAL_C5_COEFF_1,IR_OP_CAL_C5_COEFF_2,IR_OP_CAL_C5_COEFF_3,IR_TEST_CAL_C5_COEFF_1,IR_TEST_CAL_C5_COEFF_2,IR_TEST_CAL_C5_COEFF_3,EARTH_LOC_CORR_TIP_EULER,EARTH_LOC_IND,SPACECRAFT_ATT_CTRL,ATT_SMODE,ATT_PASSIVE_WHEEL_TEST,TIME_TIP_EULER,TIP_EULER_ROLL,TIP_EULER_PITCH,TIP_EULER_YAW,SPACECRAFT_ALT\n' ln = f.readline().decode('ascii') assert ln == '3406,0,2003,85,3275054,79,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.052300,-2.015999,0.152800,-51.910000,499,0.052300,-2.015999,0.152800,-51.910000,498,0.052300,-2.015999,0.152800,-51.910000,498,0.051300,-1.942999,0.151000,-51.770000,500,0.051300,-1.942999,0.151000,-51.770000,500,0.051300,-1.942999,0.151000,-51.770000,500,0.000000,0.000000,0.000000,0.000000,0,0.000000,0.000000,0.000000,0.000000,0,0.000000,0.000000,0.000000,0.000000,0,2.488212,-0.002511,0.000000,2.488212,-0.002511,0.000000,179.546496,-0.188553,0.000008,179.546496,-0.188553,0.000008,195.236384,-0.201709,0.000006,195.236384,-0.201709,0.000006,0,0,0,0,0,608093,-0.021000,-0.007000,0.000000,862.000000\n' f.close() os.unlink('tmp/n16gac10bit.l1b_metadata.csv') ############################################################################### # def test_l1b_little_endian(): ds = gdal.Open('/vsizip/data/l1b/hrpt_little_endian.l1b.zip') assert ds.GetGCPProjection().find('GRS80') >= 0 assert ds.GetRasterBand(1).Checksum() == 14145 assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 25115 ds = None gdalautotest-3.2.2/gdrivers/exr.py0000664000175000017500000002033214020414370015664 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: exr.py bf3c3a88fce3152507121894b9c42a3b99d7573d 2020-05-11 11:26:08 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test EXR driver # Author: Even Rouault # ############################################################################### # Copyright (c) 2020, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest pytestmark = pytest.mark.require_driver('EXR') def test_exr_byte_createcopy(): tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_byte_createcopy_pixel_type_half(): tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672, options = ['PIXEL_TYPE=HALF']) return tst.testCreateCopy(vsimem=1) def test_exr_byte_createcopy_pixel_type_float(): tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672, options = ['PIXEL_TYPE=FLOAT']) return tst.testCreateCopy(vsimem=1) def test_exr_byte_createcopy_pixel_type_uint(): tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672, options = ['PIXEL_TYPE=UINT']) return tst.testCreateCopy(vsimem=1) def test_exr_byte_create(): tst = gdaltest.GDALTest('EXR', 'byte.tif', 1, 4672) return tst.testCreate(vsimem=1) def test_exr_uint16_createcopy(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint16.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_uint16_create(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint16.tif', 1, 4672) return tst.testCreate(vsimem=1) def test_exr_uint32_createcopy(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint32.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_uint32_create(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/uint32.tif', 1, 4672) return tst.testCreate(vsimem=1) def test_exr_float32_createcopy(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/float32.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_float32_create(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/float32.tif', 1, 4672) return tst.testCreate(vsimem=1) def test_exr_float64_createcopy(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/float64.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) def test_exr_float64_create(): tst = gdaltest.GDALTest('EXR', '../../gcore/data/float64.tif', 1, 4672) return tst.testCreate(vsimem=1) def test_exr_compression_createcopy(): src_ds = gdal.Open('data/byte.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['COMPRESS=RLE']) assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'RLE' band = ds.GetRasterBand(1) assert band.Checksum() == 4672 ds = None gdal.Unlink(tmpfilename) def test_exr_compression_create(): src_ds = gdal.Open('data/byte.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').Create(tmpfilename, 20, 20, options = ['COMPRESS=RLE']) ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, src_ds.GetRasterBand(1).ReadRaster()) ds = None ds = gdal.Open(tmpfilename) assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'RLE' band = ds.GetRasterBand(1) assert band.Checksum() == 4672 ds = None gdal.Unlink(tmpfilename) def test_exr_compression_dwa_compression_level(): src_ds = gdal.Open('data/small_world.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['COMPRESS=DWAB', 'DWA_COMPRESSION_LEVEL=100']) assert ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') == 'DWAB' band = ds.GetRasterBand(1) assert band.Checksum() in (12863, 12864) # 12864 on s390x ds = None gdal.Unlink(tmpfilename) def test_exr_tiling(): src_ds = gdal.Open('data/byte.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['TILED=YES']) band = ds.GetRasterBand(1) assert band.GetBlockSize() == [256, 256] assert band.Checksum() == 4672 ds = None gdal.Unlink(tmpfilename) def test_exr_tiling_custom_tile_size(): src_ds = gdal.Open('data/byte.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['TILED=YES', 'BLOCKXSIZE=13', 'BLOCKYSIZE=15']) band = ds.GetRasterBand(1) assert band.GetBlockSize() == [13, 15] assert band.Checksum() == 4672 ds = None gdal.Unlink(tmpfilename) def test_exr_rgb_byte_tiled(): src_ds = gdal.Open('data/small_world.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['TILED=YES', 'BLOCKXSIZE=64', 'BLOCKYSIZE=32']) assert ds.GetRasterBand(1).Checksum() == 12852 assert ds.GetRasterBand(2).Checksum() == 12226 assert ds.GetRasterBand(3).Checksum() == 10731 ds = None gdal.Unlink(tmpfilename) def test_exr_rgb_byte_strip_no_auto_rescale(): src_ds = gdal.Open('data/small_world.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['AUTO_RESCALE=NO']) assert [ds.GetRasterBand(i+1).Checksum() for i in range(3)] == \ [src_ds.GetRasterBand(i+1).Checksum() for i in range(3)] ds = None gdal.Unlink(tmpfilename) def test_exr_overviews(): src_ds = gdal.Open('data/small_world.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['OVERVIEWS=YES']) assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(1) is None assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 2666 ds = None gdal.Unlink(tmpfilename) def test_exr_preview(): src_ds = gdal.Open('data/small_world.tif') tmpfilename = '/vsimem/temp.exr' ds = gdal.GetDriverByName('EXR').CreateCopy(tmpfilename, src_ds, options = ['PREVIEW=YES']) assert len(ds.GetSubDatasets()) == 1 subds_name = ds.GetSubDatasets()[0][0] ds = None ds = gdal.Open(subds_name) assert ds.RasterCount == 4 assert [ds.GetRasterBand(i+1).Checksum() for i in range(4)] == [51312, 51623, 55830, 61313] ds = None gdal.Unlink(tmpfilename) gdalautotest-3.2.2/gdrivers/mrf.py0000775000175000017500000005255314020414370015667 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: mrf.py 761f76ccaf891183eaf26ee4af4be45f2039d15d 2020-10-29 07:14:07 -0700 Lucian Plesea $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for MRF driver. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2016, Even Rouault, # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import glob import pytest from osgeo import gdal import gdaltest mrf_list = [ ('byte.tif', 4672, [4672], []), ('byte.tif', 4672, [4672], ['COMPRESS=DEFLATE']), ('byte.tif', 4672, [4672], ['COMPRESS=NONE']), ('byte.tif', 4672, [4672], ['COMPRESS=LERC']), ('byte.tif', 4672, [5015], ['COMPRESS=LERC', 'OPTIONS:LERC_PREC=10']), ('byte.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), ('int16.tif', 4672, [4672], []), ('int16.tif', 4672, [4672], ['COMPRESS=LERC']), ('int16.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), ('../../gcore/data/uint16.tif', 4672, [4672], []), ('../../gcore/data/uint16.tif', 4672, [4672], ['COMPRESS=LERC']), ('../../gcore/data/uint16.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), ('../../gcore/data/int32.tif', 4672, [4672], ['COMPRESS=TIF']), ('../../gcore/data/int32.tif', 4672, [4672], ['COMPRESS=LERC']), ('../../gcore/data/int32.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=TIF']), ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=LERC']), ('../../gcore/data/uint32.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), ('../../gcore/data/float32.tif', 4672, [4672], ['COMPRESS=TIF']), ('../../gcore/data/float32.tif', 4672, [4672], ['COMPRESS=LERC']), ('../../gcore/data/float32.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), ('../../gcore/data/float64.tif', 4672, [4672], ['COMPRESS=TIF']), ('../../gcore/data/float64.tif', 4672, [4672], ['COMPRESS=LERC']), ('../../gcore/data/float64.tif', 4672, [5015], ['COMPRESS=LERC', 'OPTIONS:LERC_PREC=10']), ('../../gcore/data/float64.tif', 4672, [4672], ['COMPRESS=LERC', 'OPTIONS=V1:YES']), ('../../gcore/data/utmsmall.tif', 50054, [50054], []), ('small_world.tif', 30111, [30111], ['COMPRESS=LERC', 'INTERLEAVE=PIXEL']), ('small_world.tif', 30111, [30111], ['COMPRESS=LERC', 'OPTIONS=V1:1', 'INTERLEAVE=PIXEL']), ('small_world_pct.tif', 14890, [14890], ['COMPRESS=PPNG']), ('byte.tif', 4672, [4603, 4652], ['COMPRESS=JPEG', 'QUALITY=99']), # following expected checksums are for: gcc 4.4 debug, mingw/vc9 32-bit, mingw-w64/vc12 64bit, MacOSX ('rgbsmall.tif', 21212, [21162, 21110, 21155, 21116], ['COMPRESS=JPEG', 'QUALITY=99']), ('rgbsmall.tif', 21212, [21266, 21369, 21256, 21495], ['INTERLEAVE=PIXEL', 'COMPRESS=JPEG', 'QUALITY=99']), ('rgbsmall.tif', 21212, [21261, 21209, 21254, 21215], ['INTERLEAVE=PIXEL', 'COMPRESS=JPEG', 'QUALITY=99', 'PHOTOMETRIC=RGB']), ('rgbsmall.tif', 21212, [21283, 21127, 21278, 21124], ['INTERLEAVE=PIXEL', 'COMPRESS=JPEG', 'QUALITY=99', 'PHOTOMETRIC=YCC']), ('jpeg/12bit_rose_extract.jpg', 30075, [29650, 29680, 29680, 29650], ['COMPRESS=JPEG']), ] @pytest.mark.parametrize( 'src_filename,chksum,chksum_after_reopening,options', mrf_list, ids=['{0}-{3}'.format(*r) for r in mrf_list], ) def test_mrf(src_filename, chksum, chksum_after_reopening, options): if 'COMPRESS=LERC' in options and 'LERC' not in gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST'): pytest.skip() if src_filename == 'jpeg/12bit_rose_extract.jpg': import jpeg jpeg.test_jpeg_1() if gdaltest.jpeg_version == '9b': pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/' + src_filename) if ds is None: pytest.skip() ds = None ut = gdaltest.GDALTest('MRF', src_filename, 1, chksum, options=options, chksum_after_reopening=chksum_after_reopening) check_minmax = 'COMPRESS=JPEG' not in ut.options for x in ut.options: if 'OPTIONS:LERC_PREC=' in x: check_minmax = False return ut.testCreateCopy(check_minmax=check_minmax) def test_mrf_zen_test(): result = 'success' expectedCS = 770 testvrt = ''' Gray tmp/masked.mrf 1 0:0,1:255,255:255 ''' for interleave in 'PIXEL', 'BAND': co = ['COMPRESS=JPEG', 'INTERLEAVE=' + interleave] gdal.Translate('tmp/masked.mrf', 'data/jpeg/masked.jpg', format='MRF', creationOptions=co) ds = gdal.Open(testvrt) cs = ds.GetRasterBand(1).Checksum() if cs != expectedCS: gdaltest.post_reason('Interleave=' + interleave + ' expected checksum ' + str(expectedCS) + ' got ' + str(cs)) result = 'fail' for f in glob.glob('tmp/masked.*'): gdal.Unlink(f) return result def test_mrf_overview_nnb_fact_2(): expected_cs = 1087 for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: out_ds = gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions=['COMPRESS=NONE', 'BLOCKSIZE=10'], outputType=dt) out_ds.BuildOverviews('NEARNB', [2]) out_ds = None ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, dt ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') def test_mrf_overview_nnb_with_nodata_fact_2(): expected_cs = 1117 for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: out_ds = gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions=['COMPRESS=NONE', 'BLOCKSIZE=10'], outputType=dt, noData=107) out_ds.BuildOverviews('NNB', [2]) out_ds = None ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, dt ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') def test_mrf_overview_avg_fact_2(): for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: out_ds = gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions=['COMPRESS=NONE', 'BLOCKSIZE=10'], outputType=dt) out_ds.BuildOverviews('AVG', [2]) out_ds = None expected_cs = 1152 ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, dt ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') def test_mrf_overview_avg_with_nodata_fact_2(): for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: out_ds = gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions=['COMPRESS=NONE', 'BLOCKSIZE=10'], outputType=dt, noData=107) out_ds.BuildOverviews('AVG', [2]) out_ds = None expected_cs = 1164 ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == expected_cs, dt ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.til') def test_mrf_nnb_overview_partial_block(): out_ds = gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions=['COMPRESS=NONE', 'BLOCKSIZE=8']) out_ds.BuildOverviews('NNB', [2]) out_ds = None ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.til') def test_mrf_overview_nnb_implicit_level(): expected_cs = 93 # We ask for overview level 2 and 4, triggering full overviews # so check that 8 is properly initialized out_ds = gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions=['COMPRESS=NONE', 'BLOCKSIZE=4']) out_ds.BuildOverviews('NNB', [2, 4]) out_ds = None ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).GetOverview(2).Checksum() assert cs == expected_cs ds = None with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.mrf:MRF:L3') assert ds is None ds = gdal.Open('/vsimem/out.mrf:MRF:L2') cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.til') def test_mrf_overview_external(): gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF') ds = gdal.Open('/vsimem/out.mrf') ds.BuildOverviews('NEAR', [2]) ds = None ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 1087 assert cs == expected_cs ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.mrf.ovr') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') def test_mrf_lerc_nodata(): if 'LERC' not in gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST'): pytest.skip() gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', noData=107, creationOptions=['COMPRESS=LERC']) ds = gdal.Open('/vsimem/out.mrf') nodata = ds.GetRasterBand(1).GetNoDataValue() assert nodata == 107 cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.lrc') gdal.Unlink('/vsimem/out.til') def test_mrf_lerc_with_huffman(): if 'LERC' not in gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST'): pytest.skip() gdal.Translate('/vsimem/out.mrf', 'data/small_world.tif', format='MRF', width=5000, height=5000, creationOptions=['COMPRESS=LERC']) ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 31204 assert cs == expected_cs ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.lrc') gdal.Unlink('/vsimem/out.til') def test_raw_lerc(): if 'LERC' not in gdal.GetDriverByName('MRF').GetMetadataItem('DMD_CREATIONOPTIONLIST'): pytest.skip() # Defaults to LERC2 for opt in 'OPTIONS=V1:1', None: co = ['COMPRESS=LERC'] if opt: co.append(opt) gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions = co) ds = gdal.Open('/vsimem/out.lrc') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() expected_cs = 4819 assert cs == expected_cs ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.lrc') def test_mrf_cached_source(): # Caching MRF gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF', creationOptions=['CACHEDSOURCE=invalid_source', 'NOCOPY=TRUE']) ds = gdal.Open('/vsimem/out.mrf') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() expected_cs = 0 assert cs == expected_cs ds = None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') gdal.Unlink('tmp/byte.idx') gdal.Unlink('tmp/byte.ppg') open('tmp/byte.tif', 'wb').write(open('data/byte.tif', 'rb').read()) gdal.Translate('tmp/out.mrf', 'tmp/byte.tif', format='MRF', creationOptions=['CACHEDSOURCE=byte.tif', 'NOCOPY=TRUE']) ds = gdal.Open('tmp/out.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None gdal.Unlink('tmp/byte.tif') ds = gdal.Open('tmp/out.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None # Caching MRF in mp_safe mode gdal.Unlink('tmp/out.mrf') gdal.Unlink('tmp/out.mrf.aux.xml') gdal.Unlink('tmp/out.idx') gdal.Unlink('tmp/out.ppg') gdal.Unlink('tmp/out.til') open('tmp/byte.tif', 'wb').write(open('data/byte.tif', 'rb').read()) open('tmp/out.mrf', 'wt').write( """ byte.tif PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]] """) ds = gdal.Open('tmp/out.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None gdal.Unlink('tmp/byte.tif') ds = gdal.Open('tmp/out.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None # Cloning MRF open('tmp/cloning.mrf', 'wt').write( """ out.mrf PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]] """) ds = gdal.Open('tmp/cloning.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None gdal.Unlink('tmp/out.mrf') gdal.Unlink('tmp/out.mrf.aux.xml') gdal.Unlink('tmp/out.idx') gdal.Unlink('tmp/out.ppg') gdal.Unlink('tmp/out.til') ds = gdal.Open('tmp/cloning.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None gdal.Unlink('tmp/cloning.mrf') gdal.Unlink('tmp/cloning.mrf.aux.xml') gdal.Unlink('tmp/cloning.idx') gdal.Unlink('tmp/cloning.ppg') gdal.Unlink('tmp/cloning.til') def test_mrf_versioned(): gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') # Caching MRF gdal.Translate('/vsimem/out.mrf', 'data/byte.tif', format='MRF') gdal.FileFromMemBuffer('/vsimem/out.mrf', """ PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]] """) ds = gdal.Open('/vsimem/out.mrf', gdal.GA_Update) ds.GetRasterBand(1).Fill(0) ds = None ds = gdal.Open('/vsimem/out.mrf') cs = ds.GetRasterBand(1).Checksum() expected_cs = 0 assert cs == expected_cs ds = None ds = gdal.Open('/vsimem/out.mrf:MRF:V0') cs = ds.GetRasterBand(1).Checksum() expected_cs = 0 assert cs == expected_cs ds = None ds = gdal.Open('/vsimem/out.mrf:MRF:V1') cs = ds.GetRasterBand(1).Checksum() expected_cs = 4672 assert cs == expected_cs ds = None with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.mrf:MRF:V2') assert ds is None gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') def test_mrf_cleanup(): files = [ 'jpeg/12bit_rose_extract.jpg.*', 'byte.tif.*', 'int16.tif.*', 'out.idx', 'out.mrf', 'out.mrf.aux.xml', 'out.ppg', 'rgbsmall.tif.*', 'small_world_pct.tif.*', 'float32.tif.*', 'float64.tif.*', 'int32.tif.*', 'uint16.tif.*', 'uint32.tif.*', 'utmsmall.tif.*', 'cloning.*'] for f in [fname for n in files for fname in glob.glob('tmp/' + n)]: gdal.Unlink(f) gdal.Unlink('/vsimem/out.mrf') gdal.Unlink('/vsimem/out.mrf.aux.xml') gdal.Unlink('/vsimem/out.idx') gdal.Unlink('/vsimem/out.ppg') gdal.Unlink('/vsimem/out.til') gdalautotest-3.2.2/gdrivers/loslas.py0000775000175000017500000000412314020414370016366 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: loslas.py bd95afd2b6006d4ccc8606161f43bcf47018a826 2020-05-10 14:54:53 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: LOS/LAS Testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import gdaltest ############################################################################### def test_loslas_1(): tst = gdaltest.GDALTest('LOSLAS', 'data/loslas/wyhpgn.los', 1, 0, filename_absolute=1) gt = (-111.625, 0.25, 0.0, 45.625, 0.0, -0.25) stats = (-0.027868999168276787, 0.033906999975442886, 0.009716129862575248, 0.008260044951413324) ret = tst.testOpen(check_gt=gt, check_stat=stats, check_prj='WGS84') os.unlink('data/loslas/wyhpgn.los.aux.xml') return ret gdalautotest-3.2.2/gdrivers/wcs.py0000775000175000017500000004511614020414370015674 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: wcs.py eb84e37b9172776c0ee4520cf3d3d36e3a096cf0 2020-06-03 16:32:20 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test WCS client support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import numbers import re import shutil try: import urllib.parse as urlparse except ImportError: import urlparse try: from BaseHTTPServer import BaseHTTPRequestHandler except ImportError: from http.server import BaseHTTPRequestHandler import pytest from osgeo import gdal import webserver import gdaltest ############################################################################### # Verify we have the driver. def test_wcs_1(): # Disable wcs tests till we have a more reliable test server. gdaltest.wcs_drv = gdal.GetDriverByName('WCS') # NOTE - mloskot: # This is a dirty hack checking if remote WCS service is online. # Nothing genuine but helps to keep the buildbot waterfall green. srv = 'http://demo.opengeo.org/geoserver/wcs?' if gdaltest.gdalurlopen(srv) is None: gdaltest.wcs_drv = None gdaltest.wcs_ds = None if gdaltest.wcs_drv is None: pytest.skip() ############################################################################### # Open the GeoServer WCS service. def wcs_2(): if gdaltest.wcs_drv is None: pytest.skip() # first, copy to tmp directory. open('tmp/geoserver.wcs', 'w').write(open('data/geoserver.wcs').read()) gdaltest.wcs_ds = None gdaltest.wcs_ds = gdal.Open('tmp/geoserver.wcs') if gdaltest.wcs_ds is not None: return pytest.fail('open failed.') ############################################################################### # Check various things about the configuration. def test_wcs_3(): if gdaltest.wcs_drv is None or gdaltest.wcs_ds is None: pytest.skip() assert gdaltest.wcs_ds.RasterXSize == 983 and gdaltest.wcs_ds.RasterYSize == 598 and gdaltest.wcs_ds.RasterCount == 3, \ 'wrong size or bands' wkt = gdaltest.wcs_ds.GetProjectionRef() assert wkt[:14] == 'GEOGCS["WGS 84', ('Got wrong SRS: ' + wkt) gt = gdaltest.wcs_ds.GetGeoTransform() expected_gt = (-130.85167999999999, 0.070036907426246159, 0.0, 54.114100000000001, 0.0, -0.055867725752508368) for i in range(6): assert gt[i] == pytest.approx(expected_gt[i], abs=0.00001), 'wrong geotransform' assert gdaltest.wcs_ds.GetRasterBand(1).GetOverviewCount() >= 1, 'no overviews!' assert gdaltest.wcs_ds.GetRasterBand(1).DataType == gdal.GDT_Byte, \ 'wrong band data type' ############################################################################### # Check checksum def test_wcs_4(): if gdaltest.wcs_drv is None or gdaltest.wcs_ds is None: pytest.skip() cs = gdaltest.wcs_ds.GetRasterBand(1).Checksum() assert cs == 58765, ('Wrong checksum: ' + str(cs)) ############################################################################### # Open the service using XML as filename. def wcs_5(): if gdaltest.wcs_drv is None: pytest.skip() fn = """ http://demo.opengeo.org/geoserver/wcs? Img_Sample """ ds = gdal.Open(fn) assert ds is not None, 'open failed.' assert ds.RasterXSize == 983 and ds.RasterYSize == 598 and ds.RasterCount == 3, \ 'wrong size or bands' ds = None ############################################################################### # Open the srtm plus service. def old_wcs_2(): if gdaltest.wcs_drv is None: pytest.skip() # first, copy to tmp directory. open('tmp/srtmplus.wcs', 'w').write(open('data/srtmplus.wcs').read()) gdaltest.wcs_ds = None gdaltest.wcs_ds = gdal.Open('tmp/srtmplus.wcs') if gdaltest.wcs_ds is not None: return pytest.fail('open failed.') ############################################################################### # Check various things about the configuration. def old_wcs_3(): if gdaltest.wcs_drv is None or gdaltest.wcs_ds is None: pytest.skip() assert gdaltest.wcs_ds.RasterXSize == 43200 and gdaltest.wcs_ds.RasterYSize == 21600 and gdaltest.wcs_ds.RasterCount == 1, \ 'wrong size or bands' wkt = gdaltest.wcs_ds.GetProjectionRef() assert wkt[:12] == 'GEOGCS["NAD8', ('Got wrong SRS: ' + wkt) gt = gdaltest.wcs_ds.GetGeoTransform() assert gt[0] == pytest.approx(-180.0041667, abs=0.00001) and gt[3] == pytest.approx(90.004167, abs=0.00001) and gt[1] == pytest.approx(0.00833333, abs=0.00001) and gt[2] == pytest.approx(0, abs=0.00001) and gt[5] == pytest.approx(-0.00833333, abs=0.00001) and gt[4] == pytest.approx(0, abs=0.00001), \ 'wrong geotransform' assert gdaltest.wcs_ds.GetRasterBand(1).GetOverviewCount() >= 1, 'no overviews!' assert gdaltest.wcs_ds.GetRasterBand(1).DataType >= gdal.GDT_Int16, \ 'wrong band data type' ############################################################################### # Check checksum for a small region. def old_wcs_4(): if gdaltest.wcs_drv is None or gdaltest.wcs_ds is None: pytest.skip() cs = gdaltest.wcs_ds.GetRasterBand(1).Checksum(0, 0, 100, 100) assert cs == 10469, ('Wrong checksum: ' + str(cs)) ############################################################################### # Open the srtm plus service using XML as filename. def old_wcs_5(): if gdaltest.wcs_drv is None: pytest.skip() fn = 'http://geodata.telascience.org/cgi-bin/mapserv_dem?srtmplus_raw75' ds = gdal.Open(fn) assert ds is not None, 'open failed.' assert ds.RasterXSize == 43200 and ds.RasterYSize == 21600 and ds.RasterCount == 1, \ 'wrong size or bands' ds = None ############################################################################### # utilities def read_urls(): retval = {} fname = 'data/wcs/urls' f = open(fname, 'rb') text = f.read().decode('utf-8') f.close() for line in text.splitlines(): items = line.split() if items[1].endswith('2'): items[1] = items[1][:-1] if not items[0] in retval: retval[items[0]] = {} retval[items[0]][items[1]] = items[2] return retval do_log = False wcs_6_ok = True class WCSHTTPHandler(BaseHTTPRequestHandler): def log_request(self, code=',', size=','): # pylint: disable=unused-argument pass def Headers(self, typ): self.send_response(200) self.send_header('Content-Type', typ) self.end_headers() def Respond(self, request, brand, version, test): try: fname = 'data/wcs/' if request == 'GetCapabilities': # *2 and Simple* are different coverages from same server brand = brand.replace('2', '') brand = brand.replace('Simple', '') if request == 'GetCoverage' and test == "scaled": suffix = '.tiff' self.Headers('image/tiff') fname += brand + '-' + version + '-scaled' + suffix elif request == 'GetCoverage' and test == "non_scaled": suffix = '.tiff' self.Headers('image/tiff') fname += brand + '-' + version + '-non_scaled' + suffix elif request == 'GetCoverage': suffix = '.tiff' self.Headers('image/tiff') fname += brand + '-' + version + suffix else: suffix = '.xml' self.Headers('application/xml') fname += request + '-' + brand + '-' + version + suffix f = open(fname, 'rb') content = f.read() f.close() self.wfile.write(content) except IOError: self.send_error(404, 'File Not Found: ' + request + ' ' + brand + ' ' + version) global wcs_6_ok wcs_6_ok = False def do_GET(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('GET %s\n' % self.path) f.close() split = urlparse.urlparse(self.path) query = urlparse.parse_qs(split.query) query2 = {} for key in query: query2[key.lower()] = query[key] server = query2['server'][0] version = query2['version'][0] request = query2['request'][0] test = '' if 'test' in query2: test = query2['test'][0] key = server + '-' + version if key in urls and test in urls[key]: _, got = self.path.split('SERVICE=WCS') got = re.sub(r'\&test=.*', '', got) _, have = urls[key][test].split('SERVICE=WCS') have += '&server=' + server if got == have: ok = 'ok' else: ok = "not ok\ngot: " + got + "\nhave: " + have global wcs_6_ok wcs_6_ok = False print('test ' + server + ' ' + test + ' WCS ' + version + ' ' + ok) self.Respond(request, server, version, test) def setupFct(): return { 'SimpleGeoServer': { 'URL': 'https://msp.smartsea.fmi.fi/geoserver/wcs', 'Options': [ "", "-oo OuterExtents", "-oo OuterExtents", "" ], 'Projwin': "-projwin 145300 6737500 209680 6688700", 'Outsize': "-outsize $size 0", 'Coverage': [ 'smartsea:eusm2016', 'smartsea:eusm2016', 'smartsea:eusm2016', 'smartsea__eusm2016'], 'Versions': [100, 110, 111, 201], }, 'GeoServer2': { 'URL': 'https://msp.smartsea.fmi.fi/geoserver/wcs', 'Options': [ "", "-oo OuterExtents -oo NoGridAxisSwap", "-oo OuterExtents -oo NoGridAxisSwap", "-oo NoGridAxisSwap -oo SubsetAxisSwap" ], 'Projwin': "-projwin 145300 6737500 209680 6688700", 'Outsize': "-outsize $size 0", 'Coverage': ['smartsea:south', 'smartsea:south', 'smartsea:south', 'smartsea__south'], 'Versions': [100, 110, 111, 201], 'Range': ['GREEN_BAND', 'BLUE_BAND'] }, 'GeoServer': { 'URL': 'https://msp.smartsea.fmi.fi/geoserver/wcs', 'Options': [ "", "-oo OuterExtents -oo BufSizeAdjust=0.5 -oo NoGridAxisSwap", "-oo OuterExtents -oo BufSizeAdjust=0.5 -oo NoGridAxisSwap", "-oo NoGridAxisSwap -oo SubsetAxisSwap", ], 'Projwin': "-projwin 3200000 6670000 3280000 6620000", 'Outsize': "-outsize $size 0", 'Coverage': [ 'smartsea:eusm2016-EPSG2393', 'smartsea:eusm2016-EPSG2393', 'smartsea:eusm2016-EPSG2393', 'smartsea__eusm2016-EPSG2393'], 'Versions': [100, 110, 111, 201] }, 'MapServer': { 'URL': 'http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows', 'Options': [ "-oo INTERLEAVE=PIXEL -oo OriginAtBoundary -oo BandIdentifier=none", "-oo INTERLEAVE=PIXEL -oo OffsetsPositive -oo NrOffsets=2 -oo NoGridAxisSwap -oo BandIdentifier=none", "-oo INTERLEAVE=PIXEL -oo OffsetsPositive -oo NrOffsets=2 -oo NoGridAxisSwap -oo BandIdentifier=none", "-oo INTERLEAVE=PIXEL -oo OffsetsPositive -oo NrOffsets=2 -oo NoGridAxisSwap -oo BandIdentifier=none", "-oo OriginAtBoundary", ], 'Projwin': "-projwin 10 45 15 35", 'Outsize': "-outsize $size 0", 'Coverage': 'BGS_EMODNET_CentralMed-MCol', 'Versions': [100, 110, 111, 112, 201] }, 'Rasdaman': { 'URL': 'http://ows.rasdaman.org/rasdaman/ows', 'Options': "", 'Projwin': "-projwin 10 45 15 35", 'Outsize': "-outsize $size 0", 'Coverage': 'BlueMarbleCov', 'Versions': [201] }, 'Rasdaman2': { 'URL': 'http://ows.rasdaman.org/rasdaman/ows', 'Options': '-oo subset=unix("2008-01-05T01:58:30.000Z")', 'Projwin': "-projwin 100000 5400000 150000 5100000", 'Outsize': "-outsize $size 0", 'Coverage': 'test_irr_cube_2', 'Versions': [201], 'Dimension': "unix(\"2008-01-05T01:58:30.000Z\")" }, 'ArcGIS': { 'URL': 'http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer', 'Options': [ "", "-oo NrOffsets=2", "-oo NrOffsets=2", "-oo NrOffsets=2", "-oo UseScaleFactor" ], 'Projwin': "-projwin 181000 7005000 200000 6980000", 'Outsize': "-outsize $size 0", 'Coverage': [2, 2, 2, 2, 'Coverage2'], 'Versions': [100, 110, 111, 112, 201] } } ############################################################################### def test_wcs_6(): driver = gdal.GetDriverByName('WCS') if driver is None: pytest.skip() # Generating various URLs from the driver and comparing them to ones # that have worked. first_call = True size = 60 cache = 'CACHE=wcs_cache' global urls urls = read_urls() (process, port) = webserver.launch(handler=WCSHTTPHandler) url = "http://127.0.0.1:" + str(port) setup = setupFct() servers = [] for server in setup: servers.append(server) for server in sorted(servers): for i, v in enumerate(setup[server]['Versions']): version = str(int(v / 100)) + '.' + str(int(v % 100 / 10)) + '.' + str((v % 10)) if not server + '-' + version in urls: print("Error: " + server + '-' + version + " not in urls") global wcs_6_ok wcs_6_ok = False continue options = [cache] if first_call: options.append('CLEAR_CACHE') first_call = False query = 'server=' + server + '&version=' + version ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, open_options=options) coverage = setup[server]['Coverage'] if isinstance(coverage, list): coverage = coverage[i] if isinstance(coverage, numbers.Number): coverage = str(coverage) query += '&coverage=' + coverage options = [cache] if isinstance(setup[server]['Options'], list): oo = setup[server]['Options'][i] else: oo = setup[server]['Options'] oo = oo.split() for o in oo: if o != '-oo': options.append(o) options.append('GetCoverageExtra=test=none') ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, open_options=options) ds = 0 options = [cache] options.append('GetCoverageExtra=test=scaled') options.append('INTERLEAVE=PIXEL') ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, open_options=options) if not ds: print("OpenEx failed: WCS:" + url + "/?" + query) wcs_6_ok = False break projwin = setup[server]['Projwin'].replace('-projwin ', '').split() for i, c in enumerate(projwin): projwin[i] = int(c) options = [cache] tmpfile = "tmp/" + server + version + ".tiff" gdal.Translate(tmpfile, ds, projWin=projwin, width=size, options=options) os.remove(tmpfile) if os.path.isfile('data/wcs/' + server + '-' + version + '-non_scaled.tiff'): options = [cache] options.append('GetCoverageExtra=test=non_scaled') options.append('INTERLEAVE=PIXEL') ds = gdal.OpenEx(utf8_path="WCS:" + url + "/?" + query, open_options=options) if not ds: print("OpenEx failed: WCS:" + url + "/?" + query) wcs_6_ok = False break options = [cache] gdal.Translate(tmpfile, ds, srcWin=[0, 0, 2, 2], options=options) os.remove(tmpfile) else: print(server + ' ' + version + ' non_scaled skipped (no response file)') webserver.server_stop(process, port) assert wcs_6_ok ############################################################################### # todo tests: # test that nothing is put into cache if request fails # parsing Capabilities and DescribeCoverage: test data in metadata and service files? ############################################################################### def test_wcs_cleanup(): gdaltest.wcs_drv = None gdaltest.wcs_ds = None try: os.remove('tmp/geoserver.wcs') except OSError: pass try: shutil.rmtree('wcs_cache') except OSError: pass gdalautotest-3.2.2/gdrivers/elas.py0000775000175000017500000000404514020414370016020 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: elas.py 5e4a471921bf3c0a0899bc5efe8fbd526590ea24 2020-05-10 17:50:49 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ELAS driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Test a dataset generated by Create() def test_elas_1(): tst = gdaltest.GDALTest('ELAS', 'elas/byte_elas.bin', 1, 4672) return tst.testOpen() ############################################################################### # Test Create() def test_elas_2(): tst = gdaltest.GDALTest('ELAS', 'elas/byte_elas.bin', 1, 4672) return tst.testCreate() gdalautotest-3.2.2/gdrivers/ndf.py0000775000175000017500000000540614020414370015645 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: ndf.py 2e2d1c438173943ee9d01a53aff6927f9810b111 2020-05-10 14:26:23 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test NLAPS/NDF driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Simple image test of an NLAPS/NDF2 dataset. def test_ndf_1(): tst = gdaltest.GDALTest('NDF', 'ndf/LE7134052000500350.H3', 1, 6510, xoff=0, yoff=0, xsize=15620, ysize=1) gt = (320325.75, 14.25, 0, 1383062.25, 0, -14.25) wkt = """PROJCS["UTM Zone 46, Northern Hemisphere", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AXIS["Lat",NORTH], AXIS["Long",EAST], AUTHORITY["EPSG","4326"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",93], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["Meter",1]]""" return tst.testOpen(check_gt=gt, gt_epsilon=0.0001, check_prj=wkt) gdalautotest-3.2.2/gdrivers/envi.py0000775000175000017500000003505014020414370016035 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: envi.py 48a13a1c21ceb752549164fc3e14135bd4bc5006 2020-08-17 12:27:19 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ENVI format driver. # Author: Frank Warmerdam # # See also: gcore/envi_read.py for a driver focused on raster data types. # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # Copyright (c) 2009-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### # Perform simple read test. def test_envi_1(): tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 14823) prj = """PROJCS["unnamed", GEOGCS["Ellipse Based", DATUM["Ellipse Based", SPHEROID["Unnamed",6378206.4,294.9786982139109]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Albers_Conic_Equal_Area"], PARAMETER["standard_parallel_1",29.5], PARAMETER["standard_parallel_2",45.5], PARAMETER["latitude_of_center",23], PARAMETER["longitude_of_center",-96], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["Meter",1]]""" return tst.testOpen(check_prj=prj, check_gt=(-936408.178, 28.5, 0.0, 2423902.344, 0.0, -28.5)) ############################################################################### # Verify this can be exported losslessly. def test_envi_2(): tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 14823) return tst.testCreateCopy(check_gt=1) ############################################################################### # Try the Create interface with an RGB image. def test_envi_3(): tst = gdaltest.GDALTest('envi', 'rgbsmall.tif', 2, 21053) return tst.testCreate() ############################################################################### # Test LCC Projection. def test_envi_4(): tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 24) prj = """PROJCS["unnamed", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.257222101], TOWGS84[0,0,0,0,0,0,0]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",33.90363402775256], PARAMETER["standard_parallel_2",33.62529002776137], PARAMETER["latitude_of_origin",33.76446202775696], PARAMETER["central_meridian",-117.4745428888127], PARAMETER["false_easting",20000], PARAMETER["false_northing",30000], UNIT["Meter",1]]""" return tst.testSetProjection(prj=prj) ############################################################################### # Test TM Projection. def test_envi_5(): tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 24) prj = """PROJCS["OSGB 1936 / British National Grid", GEOGCS["OSGB 1936", DATUM["OSGB_1936", SPHEROID["Airy 1830",6377563.396,299.3249646, AUTHORITY["EPSG","7001"]], TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-20.489], AUTHORITY["EPSG","6277"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.01745329251994328, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4277"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",49], PARAMETER["central_meridian",-2], PARAMETER["scale_factor",0.9996012717], PARAMETER["false_easting",400000], PARAMETER["false_northing",-100000], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","27700"]]""" # now it goes through ESRI WKT processing. expected_prj = """PROJCS["OSGB_1936_British_National_Grid", GEOGCS["GCS_OSGB 1936", DATUM["OSGB_1936", SPHEROID["Airy_1830",6377563.396,299.3249646]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",49], PARAMETER["central_meridian",-2], PARAMETER["scale_factor",0.9996012717], PARAMETER["false_easting",400000], PARAMETER["false_northing",-100000], UNIT["Meter",1]]""" return tst.testSetProjection(prj=prj, expected_prj=expected_prj) ############################################################################### # Test LAEA Projection. def test_envi_6(): gdaltest.envi_tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 24) prj = """PROJCS["unnamed", GEOGCS["Unknown datum based upon the Authalic Sphere", DATUM["D_Ellipse_Based", SPHEROID["Sphere",6370997,0]], PRIMEM["Greenwich",0], UNIT["Degree",0.0174532925199433]], PROJECTION["Lambert_Azimuthal_Equal_Area"], PARAMETER["latitude_of_center",33.764462027757], PARAMETER["longitude_of_center",-117.474542888813], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" return gdaltest.envi_tst.testSetProjection(prj=prj) ############################################################################### # Verify VSIF*L capacity def test_envi_7(): tst = gdaltest.GDALTest('envi', 'envi/aea.dat', 1, 14823) return tst.testCreateCopy(check_gt=1, vsimem=1) ############################################################################### # Test fix for #3751 def test_envi_8(): ds = gdal.GetDriverByName('ENVI').Create('/vsimem/foo.bsq', 10, 10, 1) set_gt = (50000, 1, 0, 4500000, 0, -1) ds.SetGeoTransform(set_gt) got_gt = ds.GetGeoTransform() assert set_gt == got_gt, 'did not get expected geotransform' ds = None gdal.GetDriverByName('ENVI').Delete('/vsimem/foo.bsq') ############################################################################### # Verify reading a compressed file def test_envi_9(): tst = gdaltest.GDALTest('envi', 'envi/aea_compressed.dat', 1, 14823) return tst.testCreateCopy(check_gt=1) ############################################################################### # Test RPC reading and writing def test_envi_10(): src_ds = gdal.Open('data/envi/envirpc.img') out_ds = gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/envirpc.img', src_ds) src_ds = None del out_ds gdal.Unlink('/vsimem/envirpc.img.aux.xml') ds = gdal.Open('/vsimem/envirpc.img') md = ds.GetMetadata('RPC') ds = None gdal.GetDriverByName('ENVI').Delete('/vsimem/envirpc.img') assert md['HEIGHT_OFF'] == '3355' ############################################################################### # Check .sta reading def test_envi_11(): ds = gdal.Open('data/envi/envistat') val = ds.GetRasterBand(1).GetStatistics(0, 0) ds = None assert val == [1.0, 3.0, 2.0, 0.5], 'bad stats' ############################################################################### # Test category names reading and writing def test_envi_12(): src_ds = gdal.Open('data/envi/testenviclasses') out_ds = gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/testenviclasses', src_ds) src_ds = None del out_ds gdal.Unlink('/vsimem/testenviclasses.aux.xml') ds = gdal.Open('/vsimem/testenviclasses') category = ds.GetRasterBand(1).GetCategoryNames() ct = ds.GetRasterBand(1).GetColorTable() assert category == ['Black', 'White'], 'bad category names' assert ct.GetCount() == 2, 'bad color entry count' assert ct.GetColorEntry(0) == (0, 0, 0, 255), 'bad color entry' ds = None gdal.GetDriverByName('ENVI').Delete('/vsimem/testenviclasses') ############################################################################### # Test writing of metadata from the ENVI metadata domain and read it back (#4957) def test_envi_13(): ds = gdal.GetDriverByName('ENVI').Create('/vsimem/envi_13.dat', 1, 1) ds.SetMetadata(['lines=100', 'sensor_type=Landsat TM', 'foo'], 'ENVI') ds = None gdal.Unlink('/vsimem/envi_13.dat.aux.xml') ds = gdal.Open('/vsimem/envi_13.dat') lines = ds.RasterYSize val = ds.GetMetadataItem('sensor_type', 'ENVI') ds = None gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_13.dat') assert lines == 1 assert val == 'Landsat TM' ############################################################################### # Test that the image file is at the expected size on closing (#6662) def test_envi_14(): gdal.GetDriverByName('ENVI').Create('/vsimem/envi_14.dat', 3, 4, 5, gdal.GDT_Int16) gdal.Unlink('/vsimem/envi_14.dat.aux.xml') assert gdal.VSIStatL('/vsimem/envi_14.dat').size == 3 * 4 * 5 * 2 gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_14.dat') ############################################################################### # Test reading and writing geotransform matrix with rotation def test_envi_15(): src_ds = gdal.Open('data/envi/rotation.img') got_gt = src_ds.GetGeoTransform() expected_gt = [736600.089, 1.0981889363046606, -2.4665727356350224, 4078126.75, -2.4665727356350224, -1.0981889363046606] assert max([abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) for i in range(6)]) <= 1e-5, \ 'did not get expected geotransform' gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/envi_15.dat', src_ds) ds = gdal.Open('/vsimem/envi_15.dat') got_gt = ds.GetGeoTransform() assert max([abs((got_gt[i] - expected_gt[i]) / expected_gt[i]) for i in range(6)]) <= 1e-5, \ 'did not get expected geotransform' ds = None gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_15.dat') ############################################################################### # Test reading a truncated ENVI dataset (see #915) def test_envi_truncated(): gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/envi_truncated.dat', gdal.Open('data/byte.tif')) f = gdal.VSIFOpenL('/vsimem/envi_truncated.dat', 'wb+') gdal.VSIFTruncateL(f, int(20 * 20 / 2)) gdal.VSIFCloseL(f) with gdaltest.config_option('RAW_CHECK_FILE_SIZE', 'YES'): ds = gdal.Open('/vsimem/envi_truncated.dat') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_truncated.dat') assert cs == 2315 ############################################################################### # Test writing & reading GCPs (#1528) def test_envi_gcp(): filename = '/vsimem/test_envi_gcp.dat' ds = gdal.GetDriverByName('ENVI').Create(filename, 1, 1) gcp = gdal.GCP() gcp.GCPPixel = 1 gcp.GCPLine = 2 gcp.GCPX = 3 gcp.GCPY = 4 ds.SetGCPs([gcp], None) ds = None gdal.Unlink(filename + ".aux.xml") ds = gdal.Open(filename) assert ds.GetGCPCount() == 1 gcps = ds.GetGCPs() assert len(gcps) == 1 gcp = gcps[0] ds = None assert gcp.GCPPixel == 1 assert gcp.GCPLine == 2 assert gcp.GCPX == 3 assert gcp.GCPY == 4 gdal.GetDriverByName('ENVI').Delete(filename) ############################################################################### # Test updating big endian ordered (#1796) def test_envi_bigendian(): ds = gdal.Open('data/envi/uint16_envi_bigendian.dat') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None for ext in ('dat', 'hdr'): filename = 'uint16_envi_bigendian.' + ext gdal.FileFromMemBuffer('/vsimem/' + filename, open('data/envi/' + filename, 'rb').read()) filename = '/vsimem/uint16_envi_bigendian.dat' ds = gdal.Open(filename, gdal.GA_Update) ds.SetGeoTransform([0, 2, 0, 0, 0, -2]) ds = None ds = gdal.Open(filename) assert ds.GetRasterBand(1).Checksum() == 4672 ds = None gdal.GetDriverByName('ENVI').Delete(filename) ############################################################################### # Test different interleaving def test_envi_interleaving(): for filename in ('data/envi/envi_rgbsmall_bip.img', 'data/envi/envi_rgbsmall_bil.img', 'data/envi/envi_rgbsmall_bsq.img'): ds = gdal.Open(filename) assert ds, filename assert ds.GetRasterBand(1).Checksum() == 20718, filename assert ds.GetRasterBand(2).Checksum() == 20669, filename assert ds.GetRasterBand(3).Checksum() == 20895, filename ds = None ############################################################################### # Test nodata def test_envi_nodata(): filename = '/vsimem/test_envi_nodata.dat' ds = gdal.GetDriverByName('ENVI').Create(filename, 1, 1) ds.GetRasterBand(1).SetNoDataValue(1) ds = None gdal.Unlink(filename + '.aux.xml') ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetNoDataValue() == 1.0 ds = None gdal.GetDriverByName('ENVI').Delete(filename) ############################################################################### # Test reading and writing geotransform matrix with rotation = 180 def test_envi_rotation_180(): filename = '/vsimem/test_envi_rotation_180.dat' ds = gdal.GetDriverByName('ENVI').Create(filename, 1, 1) ds.SetGeoTransform([0,10,0,0,0,10]) ds = None gdal.Unlink(filename + '.aux.xml') ds = gdal.Open(filename) got_gt = ds.GetGeoTransform() assert got_gt == (0,10,0,0,0,10) ds = None gdal.GetDriverByName('ENVI').Delete(filename) gdalautotest-3.2.2/gdrivers/vrtlut.py0000775000175000017500000000350514020414370016434 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: vrtlut.py 3ea1cb89d5dccaea43fecf7aa9aee474abd27f8a 2020-05-10 16:21:22 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test LUT translation in VRT driver # Author: Even Rouault # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Simple test def test_vrtlut_1(): tst = gdaltest.GDALTest('VRT', 'vrt/byte_lut.vrt', 1, 4655) return tst.testOpen() gdalautotest-3.2.2/gdrivers/srp.py0000775000175000017500000001202114020414370015671 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: srp.py 446096545852e0bee414b9bf21a3c5b6eca65f74 2020-05-10 12:03:43 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for SRP driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2012-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal from osgeo import osr import gdaltest ############################################################################### # Read USRP dataset with PCB=0 def test_srp_1(filename='srp/USRP_PCB0/FKUSRP01.IMG'): srs = osr.SpatialReference() srs.ImportFromEPSG(32600 + 17) tst = gdaltest.GDALTest('SRP', filename, 1, 24576) tst.testOpen(check_prj=srs.ExportToWkt(), check_gt=(500000.0, 5.0, 0.0, 5000000.0, 0.0, -5.0)) ds = gdal.Open('data/' + filename) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_PaletteIndex ct = ds.GetRasterBand(1).GetColorTable() assert ct.GetCount() == 4 assert ct.GetColorEntry(0) == (0, 0, 0, 255) assert ct.GetColorEntry(1) == (255, 0, 0, 255) expected_md = ['SRP_CLASSIFICATION=U', 'SRP_CREATIONDATE=20120505', 'SRP_EDN=0', 'SRP_NAM=FKUSRP', 'SRP_PRODUCT=USRP', 'SRP_REVISIONDATE=20120505', 'SRP_SCA=50000', 'SRP_ZNA=17'] got_md = ds.GetMetadata() for md in expected_md: (key, value) = md.split('=') assert key in got_md and got_md[key] == value, ('did not find %s' % md) ############################################################################### # Read USRP dataset with PCB=4 def test_srp_2(): return test_srp_1('srp/USRP_PCB4/FKUSRP01.IMG') ############################################################################### # Read USRP dataset with PCB=8 def test_srp_3(): return test_srp_1('srp/USRP_PCB8/FKUSRP01.IMG') ############################################################################### # Read from TRANSH01.THF file. def test_srp_4(): tst = gdaltest.GDALTest('SRP', 'srp/USRP_PCB0/TRANSH01.THF', 1, 24576) ret = tst.testOpen() return ret ############################################################################### # Read from TRANSH01.THF file (without "optimization" for single GEN in THF) def test_srp_5(): gdal.SetConfigOption('SRP_SINGLE_GEN_IN_THF_AS_DATASET', 'FALSE') ds = gdal.Open('data/srp/USRP_PCB0/TRANSH01.THF') gdal.SetConfigOption('SRP_SINGLE_GEN_IN_THF_AS_DATASET', None) subdatasets = ds.GetMetadata('SUBDATASETS') assert subdatasets['SUBDATASET_1_NAME'].replace('\\', '/') == 'SRP:data/srp/USRP_PCB0/FKUSRP01.GEN,data/srp/USRP_PCB0/FKUSRP01.IMG' assert subdatasets['SUBDATASET_1_DESC'].replace('\\', '/') == 'SRP:data/srp/USRP_PCB0/FKUSRP01.GEN,data/srp/USRP_PCB0/FKUSRP01.IMG' expected_md = ['SRP_CLASSIFICATION=U', 'SRP_CREATIONDATE=20120505', 'SRP_EDN=1', 'SRP_VOO= '] got_md = ds.GetMetadata() for md in expected_md: (key, value) = md.split('=') assert key in got_md and got_md[key] == value, ('did not find %s' % md) ############################################################################### # Read with subdataset syntax def test_srp_6(): tst = gdaltest.GDALTest('SRP', 'SRP:data/srp/USRP_PCB4/FKUSRP01.GEN,data/srp/USRP_PCB4/FKUSRP01.IMG', 1, 24576, filename_absolute=1) tst.testOpen() ############################################################################### # Cleanup def test_srp_cleanup(): # FIXME ? os.unlink('data/srp/USRP_PCB0/TRANSH01.THF.aux.xml') ############################################################################### gdalautotest-3.2.2/gdrivers/tmp/0000775000175000017500000000000014020414072015313 5ustar evenevengdalautotest-3.2.2/gdrivers/tmp/do-not-remove0000664000175000017500000000000014020414072017717 0ustar evenevengdalautotest-3.2.2/gdrivers/saga.py0000775000175000017500000001517514020414370016015 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: saga.py 2c2c4bb0cd9ffee67b6ec5e50372c6670d072d26 2020-05-10 12:48:47 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test SAGA GIS Binary driver # Author: Even Rouault, # ############################################################################### # Copyright (c) 2009, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os from osgeo import gdal import gdaltest ############################################################################### # Test opening def test_saga_1(): tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) return tst.testOpen(check_prj="""PROJCS["NAD_1927_UTM_Zone_11N", GEOGCS["GCS_North_American_1927", DATUM["North_American_Datum_1927", SPHEROID["Clarke_1866",6378206.4,294.9786982]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["Meter",1]]""") ############################################################################### # Test copying a reference sample with CreateCopy() def test_saga_2(): tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) return tst.testCreateCopy(new_filename='tmp/createcopy.sdat', check_srs=True) ############################################################################### # Test copying a reference sample with Create() def test_saga_3(): tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) return tst.testCreate(new_filename='tmp/copy.sdat', out_bands=1) ############################################################################### # Test CreateCopy() for various data types def test_saga_4(): src_files = ['byte.tif', 'int16.tif', '../../gcore/data/uint16.tif', '../../gcore/data/int32.tif', '../../gcore/data/uint32.tif', '../../gcore/data/float32.tif', '../../gcore/data/float64.tif'] for src_file in src_files: tst = gdaltest.GDALTest('SAGA', src_file, 1, 4672) if src_file == 'byte.tif': check_minmax = 0 else: check_minmax = 1 tst.testCreateCopy(new_filename='tmp/test4.sdat', check_minmax=check_minmax) ############################################################################### # Test Create() for various data types def test_saga_5(): src_files = ['byte.tif', 'int16.tif', '../../gcore/data/uint16.tif', '../../gcore/data/int32.tif', '../../gcore/data/uint32.tif', '../../gcore/data/float32.tif', '../../gcore/data/float64.tif'] for src_file in src_files: tst = gdaltest.GDALTest('SAGA', src_file, 1, 4672) if src_file == 'byte.tif': check_minmax = 0 else: check_minmax = 1 tst.testCreate(new_filename='tmp/test5.sdat', out_bands=1, check_minmax=check_minmax) ############################################################################### # Test creating empty datasets and check that nodata values are properly written def test_saga_6(): gdal_types = [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64] expected_nodata = [255, -32767, 65535, -2147483647, 4294967295, -99999.0, -99999.0] for i, gdal_type in enumerate(gdal_types): ds = gdal.GetDriverByName('SAGA').Create('tmp/test6.sdat', 2, 2, 1, gdal_type) ds = None ds = gdal.Open('tmp/test6.sdat') data = ds.GetRasterBand(1).ReadRaster(1, 1, 1, 1, buf_type=gdal.GDT_Float64) # Read raw data into tuple of float numbers import struct value = struct.unpack('d' * 1, data)[0] assert value == expected_nodata[i], 'did not get expected pixel value' nodata = ds.GetRasterBand(1).GetNoDataValue() assert nodata == expected_nodata[i], 'did not get expected nodata value' ds = None try: os.remove('tmp/test6.sgrd') os.remove('tmp/test6.sdat') except OSError: pass ############################################################################### # Test /vsimem def test_saga_7(): tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sdat', 1, 108) return tst.testCreateCopy(new_filename='/vsimem/createcopy.sdat') ############################################################################### # Test zipped saga grid (.sg-grd-z) def test_saga_8(): tst = gdaltest.GDALTest('SAGA', 'saga/4byteFloat.sg-grd-z', 1, 108) return tst.testOpen(check_prj="""PROJCS["NAD_1927_UTM_Zone_11N", GEOGCS["GCS_North_American_1927", DATUM["North_American_Datum_1927", SPHEROID["Clarke_1866",6378206.4,294.9786982]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["Meter",1]]""") gdalautotest-3.2.2/gdrivers/rpftoc.py0000775000175000017500000001011014020414370016357 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: rpftoc.py 424967e4506db10efccb5d6a3a382b8c24fb1b48 2020-05-10 11:59:48 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for RPFTOC driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil from osgeo import gdal import gdaltest ############################################################################### # Read a simple and hand-made RPFTOC dataset, made of one single CADRG frame # whose content is fully empty. def test_rpftoc_1(): tst = gdaltest.GDALTest('RPFTOC', 'NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC', 1, 53599, filename_absolute=1) gt = (1.9999416000000001, 0.0017833876302083334, 0.0, 36.000117500000002, 0.0, -0.0013461816406249993) return tst.testOpen(check_gt=gt) ############################################################################### # Same test as rpftoc_1, but the dataset is forced to be opened in RGBA mode def test_rpftoc_2(): gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'YES') tst = gdaltest.GDALTest('RPFTOC', 'NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC', 1, 0, filename_absolute=1) res = tst.testOpen() gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'NO') return res ############################################################################### # Test reading the metadata def test_rpftoc_3(): ds = gdal.Open('data/nitf/A.TOC') md = ds.GetMetadata('SUBDATASETS') assert 'SUBDATASET_1_NAME' in md and md['SUBDATASET_1_NAME'] == 'NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC', \ 'missing SUBDATASET_1_NAME metadata' ds = gdal.Open('NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:data/nitf/A.TOC') md = ds.GetMetadata() assert 'FILENAME_0' in md and md['FILENAME_0'].replace('\\', '/') == 'data/nitf/RPFTOC01.ON2' ############################################################################### # Add an overview def test_rpftoc_4(): gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'YES') shutil.copyfile('data/nitf/A.TOC', 'tmp/A.TOC') shutil.copyfile('data/nitf/RPFTOC01.ON2', 'tmp/RPFTOC01.ON2') ds = gdal.Open('NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:tmp/A.TOC') err = ds.BuildOverviews(overviewlist=[2, 4]) assert err == 0, 'BuildOverviews reports an error' assert ds.GetRasterBand(1).GetOverviewCount() == 2, \ 'Overview missing on target file.' ds = None ds = gdal.Open('NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:tmp/A.TOC') assert ds.GetRasterBand(1).GetOverviewCount() == 2, \ 'Overview missing on target file after re-open.' ds = None gdal.SetConfigOption('RPFTOC_FORCE_RGBA', 'NO') os.unlink('tmp/A.TOC') os.unlink('tmp/A.TOC.1.ovr') os.unlink('tmp/RPFTOC01.ON2') gdalautotest-3.2.2/gdrivers/rasdaman.py0000775000175000017500000000614414020414370016664 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: rasdaman.py 355b41831cd2685c85d1aabe5b95665a2c6e99b7 2019-06-19 17:07:04 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: rasdaman Testing. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest # # The rasdaman DB must be created like this : # cd $RASDAMAN_INSTALL_DIR/bin # ./create_db.sh (Note that the current user should have rights for creating a postgres database) # ./start_rasdaman.sh # ./insertdemo.sh localhost 7001 $RASDAMAN_INSTALL_DIR/share/rasdaman/examples/images rasadmin rasadmin ############################################################################### # def test_rasdaman_1(): gdaltest.rasdamanDriver = gdal.GetDriverByName('RASDAMAN') if gdaltest.rasdamanDriver is None: pytest.skip() try: ds = gdal.Open("rasdaman:query='select a[$x_lo:$x_hi,$y_lo:$y_hi] from rgb as a'") except: gdaltest.rasdamanDriver = None if ds is None: gdaltest.rasdamanDriver = None if gdaltest.rasdamanDriver is None: pytest.skip() cs = ds.GetRasterBand(1).Checksum() assert cs == 61774, 'did not get expected checksum' ############################################################################### # Test opening a non existing collection def test_rasdaman_2(): if gdaltest.rasdamanDriver is None: pytest.skip() ds = gdal.Open("rasdaman:query='select a[$x_lo:$x_hi,$y_lo:$y_hi] from notexisting as a'") assert ds is None ############################################################################### # Test syntax error def test_rasdaman_3(): if gdaltest.rasdamanDriver is None: pytest.skip() ds = gdal.Open("rasdaman:query='select'") assert ds is None gdalautotest-3.2.2/gdrivers/hf2.py0000775000175000017500000000563614020414370015562 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: hf2.py f1b948260a71bfacad979faf9ca87bf93e198bc9 2020-05-10 13:09:26 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for HF2 driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import gdaltest ############################################################################### # Test CreateCopy() of byte.tif def test_hf2_1(): tst = gdaltest.GDALTest('HF2', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1, check_gt=(-67.00041667, 0.00083333, 0.0, 50.000416667, 0.0, -0.00083333)) ############################################################################### # Test CreateCopy() of byte.tif with options def test_hf2_2(): tst = gdaltest.GDALTest('HF2', 'byte.tif', 1, 4672, options=['COMPRESS=YES', 'BLOCKSIZE=10']) ret = tst.testCreateCopy(new_filename='tmp/hf2_2.hfz') try: os.remove('tmp/hf2_2.hfz.properties') except OSError: pass return ret ############################################################################### # Test CreateCopy() of float.img def test_hf2_3(): tst = gdaltest.GDALTest('HF2', 'hfa/float.img', 1, 23529) return tst.testCreateCopy(check_minmax=0) ############################################################################### # Test CreateCopy() of n43.dt0 def test_hf2_4(): tst = gdaltest.GDALTest('HF2', 'n43.dt0', 1, 49187) return tst.testCreateCopy() ############################################################################### # Cleanup def test_hf2_cleanup(): pass gdalautotest-3.2.2/gdrivers/gpkg.py0000775000175000017500000036422314020414370016033 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: gpkg.py 14ed22d81052a84be154c6fbc85461e43e1652a9 2020-10-14 17:05:31 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GeoPackage raster functionality. # Author: Even Rouault # ############################################################################### # Copyright (c) 2014, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import sys import pytest # Make sure we run from the directory of the script if os.path.basename(sys.argv[0]) == os.path.basename(__file__): if os.path.dirname(sys.argv[0]) != '': os.chdir(os.path.dirname(sys.argv[0])) from osgeo import osr, gdal, ogr import gdaltest ############################################################################### # Validate a geopackage def validate(filename, quiet=False): path = '../../gdal/swig/python/samples' if path not in sys.path: sys.path.append(path) try: import validate_gpkg except ImportError: print('Cannot import validate_gpkg') return True my_filename = filename if my_filename.startswith('/vsimem/'): my_filename = 'tmp/validate.gpkg' f = gdal.VSIFOpenL(filename, 'rb') if f is None: print('Cannot open %s' % filename) return False content = gdal.VSIFReadL(1, 10000000, f) gdal.VSIFCloseL(f) open(my_filename, 'wb').write(content) try: validate_gpkg.check(my_filename) except Exception as e: if not quiet: print(e) return False finally: if my_filename != filename: os.unlink(my_filename) return True ############################################################################### # Test if GPKG and tile drivers are available def test_gpkg_init(): gdaltest.gpkg_dr = None gdaltest.gpkg_dr = gdal.GetDriverByName('GPKG') if gdaltest.gpkg_dr is None: pytest.skip() gdaltest.png_dr = gdal.GetDriverByName('PNG') gdaltest.jpeg_dr = gdal.GetDriverByName('JPEG') gdaltest.webp_dr = gdal.GetDriverByName('WEBP') gdaltest.webp_supports_rgba = False if gdaltest.webp_dr is not None and gdal.GetConfigOption("GPKG_SIMUL_WEBP_3BAND") is None: md = gdaltest.webp_dr.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LOSSLESS') >= 0: gdaltest.webp_supports_rgba = True # This is to speed-up the runtime of tests on EXT4 filesystems # Do not use this for production environment if you care about data safety # w.r.t system/OS crashes, unless you know what you are doing. gdal.SetConfigOption('OGR_SQLITE_SYNCHRONOUS', 'OFF') gdal.SetConfigOption('GPKG_DEBUG', 'ON') ############################################################################### # def get_expected_checksums(src_ds, tile_drv, working_bands, extend_src=True, clamp_output=True): if extend_src: mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256, working_bands) else: mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, working_bands) for i in range(working_bands): if src_ds.RasterCount == 2 and working_bands == 3: src_band = 1 elif src_ds.RasterCount == 2 and working_bands == 4: if i < 3: src_band = 1 else: src_band = 2 elif src_ds.RasterCount == 1: src_band = 1 else: src_band = i + 1 data = src_ds.GetRasterBand(src_band).ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize) mem_ds.GetRasterBand(i + 1).WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data) if tile_drv.ShortName == 'PNG': options = [] else: options = ['QUALITY=75'] tmp_ds = tile_drv.CreateCopy('/vsimem/tmp.' + tile_drv.ShortName, mem_ds, options=options) if clamp_output: mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, working_bands) mem_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, tmp_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) expected_cs = [mem_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] else: tmp_ds.FlushCache() expected_cs = [tmp_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] mem_ds = None tmp_ds = None gdal.Unlink('/vsimem/tmp.' + tile_drv.ShortName) return expected_cs ############################################################################### # def check_tile_format(out_ds, expected_format, expected_band_count, expected_ct, row=0, col=0, zoom_level=None): if zoom_level is None: zoom_level_str = "(SELECT MAX(zoom_level) FROM tmp)" else: zoom_level_str = str(zoom_level) sql_lyr = out_ds.ExecuteSQL('SELECT GDAL_GetMimeType(tile_data), ' + 'GDAL_GetBandCount(tile_data), ' + 'GDAL_HasColorTable(tile_data) FROM tmp ' + 'WHERE zoom_level = %s AND tile_column = %d AND tile_row = %d' % (zoom_level_str, col, row)) feat = sql_lyr.GetNextFeature() if feat is not None: mime_type = feat.GetField(0) band_count = feat.GetField(1) has_ct = feat.GetField(2) else: mime_type = None band_count = None has_ct = None out_ds.ReleaseResultSet(sql_lyr) out_ds = None if expected_format is None: if mime_type is None: return pytest.fail() if expected_format == 'PNG': expected_mime_type = 'image/png' elif expected_format == 'JPEG': expected_mime_type = 'image/jpeg' elif expected_format == 'WEBP': expected_mime_type = 'image/x-webp' assert mime_type == expected_mime_type assert band_count == expected_band_count assert expected_ct == has_ct ############################################################################### # Single band, PNG def test_gpkg_1(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # With padding ds = gdal.Open('data/byte.tif') expected_cs = ds.GetRasterBand(1).Checksum() clamped_expected_cs = get_expected_checksums(ds, gdaltest.png_dr, 1, clamp_output=False)[0] expected_gt = ds.GetGeoTransform() expected_wkt = ds.GetProjectionRef() with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG']) ds = None assert validate('/vsimem/tmp.gpkg'), 'validation failed' out_ds = gdal.Open('/vsimem/tmp.gpkg') # Check there's no ogr_empty_table sql_lyr = out_ds.ExecuteSQL("SELECT COUNT(*) FROM sqlite_master WHERE name = 'ogr_empty_table'") f = sql_lyr.GetNextFeature() assert f.GetField(0) == 0 out_ds.ReleaseResultSet(sql_lyr) got_gt = out_ds.GetGeoTransform() for i in range(6): assert expected_gt[i] == pytest.approx(got_gt[i], abs=1e-8) got_wkt = out_ds.GetProjectionRef() assert expected_wkt == got_wkt expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 2, False) # Check that there's no extensions out_ds = gdal.Open('/vsimem/tmp.gpkg') sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_spatial_ref_sys') assert sql_lyr.GetLayerDefn().GetFieldIndex('definition_12_063') < 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=3']) expected_cs = expected_cs[0:3] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] assert got_cs == expected_cs out_ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) assert ds.RasterXSize == 256 and ds.RasterYSize == 256 expected_cs = [clamped_expected_cs, clamped_expected_cs, clamped_expected_cs, 4898] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None # Test USE_TILE_EXTENT=YES with empty table ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE) ds.ExecuteSQL('DELETE FROM tmp') ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER, open_options=['USE_TILE_EXTENT=YES']) assert ds is None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding ds = gdal.Open('data/byte.tif') expected_cs = ds.GetRasterBand(1).Checksum() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=20']) out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 1, False) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Single band, JPEG def test_gpkg_2(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.jpeg_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # With padding ds = gdal.Open('data/byte.tif') expected_cs = get_expected_checksums(ds, gdaltest.jpeg_dr, 1)[0] clamped_expected_cs = get_expected_checksums(ds, gdaltest.jpeg_dr, 3, clamp_output=False) clamped_expected_cs.append(17849) with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=JPEG']) out_ds = gdal.Open('/vsimem/tmp.gpkg') expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, 'JPEG', 1, False) # Check that there's no extensions out_ds = gdal.Open('/vsimem/tmp.gpkg') sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == clamped_expected_cs ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding ds = gdal.Open('data/byte.tif') expected_cs = get_expected_checksums(ds, gdaltest.jpeg_dr, 1, extend_src=False)[0] out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=JPEG', 'BLOCKSIZE=20']) out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') expected_cs = [expected_cs, expected_cs, expected_cs, 4873] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, 'JPEG', 1, False) # Try deregistering JPEG driver gdaltest.jpeg_dr.Deregister() out_ds = gdal.Open('/vsimem/tmp.gpkg') # Should give warning at pixel reading time gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') out_ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ds = gdal.Open('data/byte.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=JPEG']) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') out_ds.FlushCache() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' out_ds = None # Re-register driver gdaltest.jpeg_dr.Register() gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Single band, WEBP def test_gpkg_3(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.webp_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') ds = gdal.Open('data/byte.tif') expected_cs = get_expected_checksums(ds, gdaltest.webp_dr, 3) clamped_expected_cs = get_expected_checksums(ds, gdaltest.webp_dr, 3, clamp_output=False) if gdaltest.webp_supports_rgba: clamped_expected_cs.append(4898) else: clamped_expected_cs.append(17849) out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=WEBP']) out_ds = None assert validate('/vsimem/tmp.gpkg'), 'validation failed' out_ds = gdal.OpenEx('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs in (expected_cs, [4736, 4734, 4736]) # Check that extension is declared sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND column_name = 'tile_data' AND extension_name = 'gpkg_webp'") assert sql_lyr.GetFeatureCount() == 1 out_ds.ReleaseResultSet(sql_lyr) if gdaltest.webp_supports_rgba: expected_band_count = 4 else: expected_band_count = 3 check_tile_format(out_ds, 'WEBP', expected_band_count, False) out_ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs in (clamped_expected_cs, [6850, 6848, 6850, 4898]) ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding ds = gdal.Open('data/byte.tif') expected_cs = get_expected_checksums(ds, gdaltest.webp_dr, 3, extend_src=False) out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=WEBP', 'BLOCKSIZE=20']) out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') expected_cs.append(4873) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, 'WEBP', 3, False) # Try deregistering WEBP driver gdaltest.webp_dr.Deregister() # Should give warning at open time since the webp extension is declared gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') out_ds = gdal.Open('/vsimem/tmp.gpkg') gdal.PopErrorHandler() if gdal.GetLastErrorMsg() == '': gdaltest.webp_dr.Register() pytest.fail() # And at pixel reading time as well gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') out_ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() if gdal.GetLastErrorMsg() == '': gdaltest.webp_dr.Register() pytest.fail() out_ds = None # Re-register driver gdaltest.webp_dr.Register() gdal.Unlink('/vsimem/tmp.gpkg') # Check updating a non-WEBP dataset with TILE_FORMAT=WEBP out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) out_ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE, open_options=['TILE_FORMAT=WEBP']) sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND column_name = 'tile_data' AND extension_name = 'gpkg_webp'") assert sql_lyr.GetFeatureCount() == 1 out_ds.ReleaseResultSet(sql_lyr) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Three band, PNG def test_gpkg_4(tile_drv_name='PNG'): if gdaltest.gpkg_dr is None: pytest.skip() if tile_drv_name == 'PNG': tile_drv = gdaltest.png_dr working_bands = 4 elif tile_drv_name == 'JPEG': tile_drv = gdaltest.jpeg_dr working_bands = 3 elif tile_drv_name == 'WEBP': tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: working_bands = 4 else: working_bands = 3 if tile_drv is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') ds = gdal.Open('data/rgbsmall.tif') expected_cs = get_expected_checksums(ds, tile_drv, 3) clamped_expected_cs = get_expected_checksums(ds, tile_drv, 3, clamp_output=False) if working_bands == 3: clamped_expected_cs.append(17849) else: clamped_expected_cs.append(30638) out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=' + tile_drv_name]) ds = None out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') expected_cs.append(30658) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs in (expected_cs, [22290, 21651, 21551, 30658], [22286, 21645, 21764, 30658], # libwebp 1.0.3 ) check_tile_format(out_ds, tile_drv_name, working_bands, False) out_ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs in (clamped_expected_cs, [56886, 43228, 56508, 30638], [30478, 31718, 31360, 30638], # libwebp 1.0.3 ) ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding ds = gdal.Open('data/rgbsmall.tif') expected_cs = get_expected_checksums(ds, tile_drv, 3, extend_src=False) expected_cs.append(30658) out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=' + tile_drv_name, 'BLOCKSIZE=50']) out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, tile_drv_name, 3, False) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Three band, JPEG def test_gpkg_5(): return test_gpkg_4(tile_drv_name='JPEG') ############################################################################### # Three band, WEBP def test_gpkg_6(): return test_gpkg_4(tile_drv_name='WEBP') ############################################################################### # 4 band, PNG def get_georeferenced_rgba_ds(alpha_fully_transparent=False, alpha_fully_opaque=False): assert not (alpha_fully_transparent and alpha_fully_opaque) src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tmp.tif', src_ds.RasterXSize, src_ds.RasterYSize, 4) tmp_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) if alpha_fully_opaque: tmp_ds.GetRasterBand(4).Fill(255) elif alpha_fully_transparent: tmp_ds.GetRasterBand(4).Fill(0) return tmp_ds def test_gpkg_7(tile_drv_name='PNG'): if gdaltest.gpkg_dr is None: pytest.skip() if tile_drv_name == 'PNG': tile_drv = gdaltest.png_dr working_bands = 4 elif tile_drv_name == 'JPEG': tile_drv = gdaltest.jpeg_dr working_bands = 3 elif tile_drv_name == 'WEBP': tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: working_bands = 4 else: working_bands = 3 if tile_drv is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') src_ds = get_georeferenced_rgba_ds() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=' + tile_drv_name]) out_ds = None expected_cs = get_expected_checksums(src_ds, tile_drv, working_bands) src_filename = src_ds.GetDescription() src_ds = None gdal.Unlink(src_filename) out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] assert got_cs == expected_cs check_tile_format(out_ds, tile_drv_name, working_bands, False) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding with alpha fully opaque tmp_ds = get_georeferenced_rgba_ds(alpha_fully_opaque=True) expected_cs = get_expected_checksums(tmp_ds, tile_drv, 3, extend_src=False) tmp_filename = tmp_ds.GetDescription() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['TILE_FORMAT=' + tile_drv_name, 'BLOCKXSIZE=%d' % tmp_ds.RasterXSize, 'BLOCKYSIZE=%d' % tmp_ds.RasterYSize]) out_ds = None tmp_ds = None gdal.Unlink(tmp_filename) out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs check_tile_format(out_ds, tile_drv_name, 3, False) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding with alpha fully transparent tmp_ds = get_georeferenced_rgba_ds(alpha_fully_transparent=True) tmp_filename = tmp_ds.GetDescription() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['TILE_FORMAT=' + tile_drv_name, 'BLOCKXSIZE=%d' % tmp_ds.RasterXSize, 'BLOCKYSIZE=%d' % tmp_ds.RasterYSize]) out_ds = None tmp_ds = None gdal.Unlink(tmp_filename) out_ds = gdal.Open('/vsimem/tmp.gpkg') expected_cs = [0, 0, 0, 0] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, None, None, None) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # 4 band, JPEG def test_gpkg_8(): return test_gpkg_7(tile_drv_name='JPEG') ############################################################################### # 4 band, WEBP def test_gpkg_9(): return test_gpkg_7(tile_drv_name='WEBP') ############################################################################### # def get_georeferenced_ds_with_pct32(): src_ds = gdal.Open('../gcore/data/stefan_full_rgba_pct32.png') tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tmp.tif', src_ds.RasterXSize, src_ds.RasterYSize) tmp_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) tmp_ds.GetRasterBand(1).SetColorTable(src_ds.GetRasterBand(1).GetColorTable()) tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) return tmp_ds ############################################################################### # Single band with 32 bit color table, PNG def test_gpkg_10(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') tmp_ds = get_georeferenced_ds_with_pct32() expected_ct = tmp_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = tmp_ds.GetRasterBand(1).Checksum() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['BLOCKXSIZE=%d' % tmp_ds.RasterXSize, 'BLOCKYSIZE=%d' % tmp_ds.RasterYSize]) out_ds = None tmp_filename = tmp_ds.GetDescription() tmp_ds = None gdal.Unlink(tmp_filename) expected_cs = [10991, 57677, 34965, 10638] out_ds = gdal.Open('/vsimem/tmp.gpkg') block_size = out_ds.GetRasterBand(1).GetBlockSize() assert block_size == [out_ds.RasterXSize, out_ds.RasterYSize] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 1, True) got_ct = out_ds.GetRasterBand(1).GetColorTable() assert got_ct is None # SetColorTable() on a non single-band dataset gdal.ErrorReset() gdal.PushErrorHandler() out_ds.GetRasterBand(1).SetColorTable(None) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' out_ds = None expected_cs = [expected_cs_single_band] out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=1']) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() assert expected_ct.GetCount() == got_ct.GetCount() # SetColorTable() on a re-opened dataset gdal.ErrorReset() gdal.PushErrorHandler() out_ds.GetRasterBand(1).SetColorTable(None) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Repeated SetColorTable() out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) out_ds.GetRasterBand(1).SetColorTable(None) gdal.ErrorReset() gdal.PushErrorHandler() out_ds.GetRasterBand(1).SetColorTable(None) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.PushErrorHandler() out_ds = None gdal.PopErrorHandler() gdal.Unlink('/vsimem/tmp.gpkg') # Partial tile tmp_ds = get_georeferenced_ds_with_pct32() expected_ct = tmp_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = tmp_ds.GetRasterBand(1).Checksum() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds) out_ds = None tmp_filename = tmp_ds.GetDescription() tmp_ds = None gdal.Unlink(tmp_filename) expected_cs = [10991, 57677, 34965, 10638] out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 4, False) got_ct = out_ds.GetRasterBand(1).GetColorTable() assert got_ct is None ############################################################################### # Single band with 32 bit color table, JPEG def test_gpkg_11(tile_drv_name='JPEG'): if gdaltest.gpkg_dr is None: pytest.skip() if tile_drv_name == 'JPEG': tile_drv = gdaltest.jpeg_dr working_bands = 3 elif tile_drv_name == 'WEBP': tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: working_bands = 4 else: working_bands = 3 if tile_drv is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') rgba_xml = '' for i in range(4): rgba_xml += """ ../gcore/data/stefan_full_rgba_pct32.png 1 %d """ % (i + 1, i + 1) rgba_xml += '' rgba_ds = gdal.Open(rgba_xml) tmp_ds = get_georeferenced_ds_with_pct32() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=['TILE_FORMAT=' + tile_drv_name]) out_ds = None tmp_filename = tmp_ds.GetDescription() tmp_ds = None gdal.Unlink(tmp_filename) expected_cs = get_expected_checksums(rgba_ds, tile_drv, working_bands) rgba_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(working_bands)] assert got_cs == expected_cs out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Single band with 32 bit color table, WEBP def test_gpkg_12(): return test_gpkg_11(tile_drv_name='WEBP') ############################################################################### # Single band with 24 bit color table, PNG def test_gpkg_13(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') src_ds = gdal.Open('data/small_world_pct.tif') expected_ct = src_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = src_ds.GetRasterBand(1).Checksum() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['BLOCKXSIZE=%d' % src_ds.RasterXSize, 'BLOCKYSIZE=%d' % src_ds.RasterYSize]) out_ds = None src_ds = None expected_cs = [63025, 48175, 12204] out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() assert got_ct is None out_ds = None expected_cs = [expected_cs_single_band] out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=1']) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(out_ds.RasterCount)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() assert expected_ct.GetCount() == got_ct.GetCount() out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Partial tile src_ds = gdal.Open('data/small_world_pct.tif') expected_ct = src_ds.GetRasterBand(1).GetColorTable().Clone() expected_cs_single_band = src_ds.GetRasterBand(1).Checksum() out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds) out_ds = None src_ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) assert ds.RasterXSize == 512 and ds.RasterYSize == 256 expected_cs = [62358, 45823, 12238, 64301] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test creation and opening options def test_gpkg_14(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') src_ds = gdal.Open('data/small_world.tif') ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'RASTER_TABLE=foo', 'RASTER_IDENTIFIER=bar', 'RASTER_DESCRIPTION=baz']) ds = None gdal.PushErrorHandler() ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['TABLE=non_existing']) gdal.PopErrorHandler() assert ds is None ds = gdal.Open('/vsimem/tmp.gpkg') sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE table_name='foo'") feat_count = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert feat_count == 1 assert ds.GetMetadataItem('IDENTIFIER') == 'bar', ds.GetMetadata() assert ds.GetMetadataItem('DESCRIPTION') == 'baz', ds.GetMetadata() assert ds.GetMetadataItem('ZOOM_LEVEL') == '1', ds.GetMetadata() assert ds.GetRasterBand(1).GetOverviewCount() == 0 assert ds.GetRasterBand(1).GetOverview(0) is None ds = None # In update mode, we expose even empty overview levels ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert ds.GetMetadataItem('ZOOM_LEVEL') == '1', ds.GetMetadata() assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(0) is not None assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 0 ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['ZOOM_LEVEL=2']) assert ds.RasterXSize == 400 ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['ZOOM_LEVEL=1']) assert ds.RasterXSize == 400 assert ds.GetRasterBand(1).GetOverviewCount() == 0 ds = None # In update mode, we expose even empty overview levels ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['ZOOM_LEVEL=1']) assert ds.RasterXSize == 400 assert ds.GetRasterBand(1).GetOverviewCount() == 1 ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['ZOOM_LEVEL=0']) assert ds.RasterXSize == 200 assert ds.GetRasterBand(1).Checksum() == 0 ds = None gdal.Translate('/vsimem/tmp2.gpkg', 'data/byte.tif', format='GPKG') ds = gdal.OpenEx('/vsimem/tmp2.gpkg', gdal.OF_UPDATE) ds.ExecuteSQL('UPDATE gpkg_contents SET min_x = NULL') ds = None with gdaltest.error_handler(): ds = gdal.OpenEx('/vsimem/tmp2.gpkg', open_options=['ZOOM_LEVEL=-1']) assert ds is None gdal.Unlink('/vsimem/tmp2.gpkg') ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) assert ds.RasterXSize == 512 and ds.RasterYSize == 256 expected_cs = [27644, 31968, 38564, 64301] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None # Open with exactly one tile shift ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['TILE_FORMAT=PNG', 'MINX=-410.4', 'MAXY=320.4']) assert ds.RasterXSize == 400 + 256 and ds.RasterYSize == 200 + 256 expected_cs = [29070, 32796, 41086, 64288] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Fill(0) ds.FlushCache() sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) ds = None # Partial tile shift (enclosing tiles) ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', gdal.OF_UPDATE, open_options=['MINX=-270', 'MAXY=180', 'MINY=-180', 'MAXX=270']) assert ds.RasterXSize == 600 and ds.RasterYSize == 400 expected_cs = [28940, 32454, 40526, 64323] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs # Force full rewrite data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) # Do a clean just to be sure for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Fill(0) ds.FlushCache() sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) ds = None ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', gdal.OF_UPDATE, open_options=['MINX=-270', 'MAXY=180', 'MINY=-180', 'MAXX=270']) expected_cs = [28940, 32454, 40526, 64323] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs # Partial rewrite data = ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) ds.GetRasterBand(1).WriteRaster(0, 0, 256, 256, data) ds = None ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', open_options=['MINX=-270', 'MAXY=180', 'MINY=-180', 'MAXX=270']) expected_cs = [28940, 32454, 40526, 64323] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None # Partial tile shift (included in tiles) ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', gdal.OF_UPDATE, open_options=['MINX=-90', 'MAXY=45', 'MINY=-45', 'MAXX=90']) assert ds.RasterXSize == 200 and ds.RasterYSize == 100 expected_cs = [9586, 9360, 26758, 48827] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs # Force full rewrite data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data) ds = None ds = gdal.OpenEx('GPKG:/vsimem/tmp.gpkg:foo', open_options=['MINX=-90', 'MAXY=45', 'MINY=-45', 'MAXX=90']) assert ds.RasterXSize == 200 and ds.RasterYSize == 100 expected_cs = [9586, 9360, 26758, 48827] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['APPEND_SUBDATASET=YES', 'RASTER_TABLE=other', 'BLOCKSIZE=64', 'TILE_FORMAT=PNG']) ds = None another_src_ds = gdal.Open('data/byte.tif') ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', another_src_ds, options=['APPEND_SUBDATASET=YES']) ds = None another_src_ds = None ds = gdal.Open('/vsimem/tmp.gpkg') md = ds.GetMetadata('SUBDATASETS') assert md['SUBDATASET_1_NAME'] == 'GPKG:/vsimem/tmp.gpkg:foo' assert md['SUBDATASET_1_DESC'] == 'foo - bar' assert md['SUBDATASET_2_NAME'] == 'GPKG:/vsimem/tmp.gpkg:other' assert md['SUBDATASET_2_DESC'] == 'other - other' assert md['SUBDATASET_3_NAME'] == 'GPKG:/vsimem/tmp.gpkg:byte' assert md['SUBDATASET_3_DESC'] == 'byte - byte' ds = None ds = gdal.Open('GPKG:/vsimem/tmp.gpkg:other') block_size = ds.GetRasterBand(1).GetBlockSize() assert block_size == [64, 64] ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['TABLE=other', 'MINX=-90', 'MAXY=45', 'MINY=-45', 'MAXX=90']) assert ds.RasterXSize == 200 and ds.RasterYSize == 100 block_size = ds.GetRasterBand(1).GetBlockSize() assert block_size == [64, 64] expected_cs = [9586, 9360, 26758, 48827] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Open and fill with an area of interest larger/containing the natural extent ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 20, 20, 1, options=['BLOCKSIZE=20']) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=-5', 'MAXY=5', 'MAXX=25', 'MINY=-25', 'BAND_COUNT=1']) ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINX=-10', 'MAXY=10', 'MINY=-30', 'MAXX=30']) expected_cs = [4934, 4934, 4934, 4934] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Open and fill with an area of interest smaller/inside the natural extent # (and smaller than the block size actually) ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 20, 20, 1, options=['BLOCKSIZE=20']) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=5', 'MAXY=-5', 'MAXX=15', 'MINY=-15', 'BAND_COUNT=1']) ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINX=-10', 'MAXY=10', 'MINY=-30', 'MAXX=30']) expected_cs = [1223, 1223, 1223, 1223] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Other corner case : the block intersects a tile at the right of the raster # size (because the raster size is smaller than the block size) ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 400, 200, 1) ds.SetGeoTransform([-180, 0.9, 0, 90, 0, -0.9]) ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=-5', 'MAXY=5', 'MAXX=25', 'MINY=-25', 'BAND_COUNT=1']) ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg') expected_cs = [13365, 13365, 13365, 13365] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Test reading block from partial tile database ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 512, 256, 4) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE, open_options=['MINX=-5', 'MAXY=5', 'TILE_FORMAT=PNG']) mem_ds = gdal.GetDriverByName('MEM').Create('', 256, 256) mem_ds.GetRasterBand(1).Fill(255) mem_ds.FlushCache() data = mem_ds.GetRasterBand(1).ReadRaster() mem_ds = None # Only write one of the tile ds.GetRasterBand(2).WriteRaster(0, 0, 256, 256, data) # "Flush" into partial tile database, but not in definitive database oldSize = gdal.GetCacheMax() gdal.SetCacheMax(0) gdal.SetCacheMax(oldSize) sql_lyr = ds.ExecuteSQL('SELECT * FROM tmp') fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 expected_cs = [0, 56451, 0, 0] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] if got_cs != expected_cs: ds.GetRasterBand(4).Fill(255) # sys.exit(0) pytest.fail('Got %s, expected %s' % (str(got_cs), str(expected_cs))) ds = None # Overflow occurred in ComputeTileAndPixelShifts() with gdaltest.error_handler(): ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINX=-1e12', 'MAXX=-0.9999e12']) assert ds is None # Overflow occurred in ComputeTileAndPixelShifts() with gdaltest.error_handler(): ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['MINY=-1e12', 'MAXY=-0.9999e12']) assert ds is None # Overflow occurred in ComputeTileAndPixelShifts() gdal.Translate('/vsimem/tmp.gpkg', 'data/byte.tif', format='GPKG') ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_UPDATE) ds.ExecuteSQL('UPDATE gpkg_contents SET min_x=-1000000002000, max_x=-1000000000000') ds = None with gdaltest.error_handler(): ds = gdal.Open('/vsimem/tmp.gpkg') assert ds is None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test error cases def test_gpkg_15(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # SetGeoTransform() and SetProjection() on a non-raster GPKG out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 0, 0, 0) assert out_ds.GetGeoTransform(can_return_null=True) is None assert out_ds.GetProjectionRef() == '' gdal.PushErrorHandler() ret = out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) gdal.PopErrorHandler() assert ret != 0 srs = osr.SpatialReference() srs.ImportFromEPSG(4326) gdal.PushErrorHandler() ret = out_ds.SetProjection(srs.ExportToWkt()) gdal.PopErrorHandler() assert ret != 0 out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Repeated SetGeoTransform() out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) ret = out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) assert ret == 0 gdal.PushErrorHandler() ret = out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Repeated SetProjection() out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert out_ds.GetProjectionRef() == '' srs = osr.SpatialReference() srs.ImportFromEPSG(4326) ret = out_ds.SetProjection(srs.ExportToWkt()) assert ret == 0 assert out_ds.GetProjectionRef().find('4326') >= 0 out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert out_ds.GetProjectionRef().find('4326') >= 0 out_ds.SetProjection('') out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') assert out_ds.GetProjectionRef() == '' # Test setting on read-only dataset gdal.PushErrorHandler() ret = out_ds.SetProjection('') gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) gdal.PopErrorHandler() assert ret != 0 out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Test SetColorInterpretation() out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_Undefined) assert ret == 0 ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_GrayIndex) assert ret == 0 ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_PaletteIndex) assert ret == 0 gdal.PushErrorHandler() ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) gdal.PopErrorHandler() assert ret != 0 out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 3) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) assert ret == 0 gdal.PushErrorHandler() ret = out_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_RedBand) gdal.PopErrorHandler() assert ret != 0 out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 2) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_GrayIndex) assert ret == 0 gdal.PushErrorHandler() ret = out_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) gdal.PopErrorHandler() assert ret != 0 ret = out_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) assert ret == 0 gdal.PushErrorHandler() ret = out_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_RedBand) gdal.PopErrorHandler() assert ret != 0 out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test block/tile caching def test_gpkg_16(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.jpeg_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 3, options=['TILE_FORMAT=JPEG']) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) out_ds.GetRasterBand(1).Fill(255) out_ds.GetRasterBand(1).FlushCache() # Rewrite same tile after re-reading it # Will cause a debug message to be emitted out_ds.GetRasterBand(2).Fill(127) out_ds.GetRasterBand(3).Checksum() out_ds.GetRasterBand(2).FlushCache() out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') val1 = ord(out_ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1)) val2 = ord(out_ds.GetRasterBand(2).ReadRaster(0, 0, 1, 1)) val3 = ord(out_ds.GetRasterBand(3).ReadRaster(0, 0, 1, 1)) out_ds = None assert val1 == pytest.approx(255, abs=1) assert val2 == pytest.approx(127, abs=1) assert val3 == pytest.approx(0, abs=1) gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test overviews with single band dataset def test_gpkg_17(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, immediately after create copy ds = gdal.Open('data/byte.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=10']) out_ds.BuildOverviews('NEAR', [2]) out_ds = None ds = None assert validate('/vsimem/tmp.gpkg'), 'validation failed' out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = out_ds.GetRasterBand(1).GetOverview(0).Checksum() assert got_cs == 1087 check_tile_format(out_ds, 'PNG', 1, False, zoom_level=0) assert out_ds.GetRasterBand(1).GetOverview(0).GetColorTable() is None out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, after reopening, and BAND_COUNT = 1 ds = gdal.Open('data/byte.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=10']) out_ds = None # FIXME? Should we eventually write the driver somewhere in metadata ? out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE, open_options=['TILE_FORMAT=PNG', 'BAND_COUNT=1']) out_ds.BuildOverviews('NEAR', [2]) out_ds = None ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = out_ds.GetRasterBand(1).GetOverview(0).Checksum() assert got_cs == 1087 check_tile_format(out_ds, 'PNG', 1, False, zoom_level=0) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, after reopening ds = gdal.Open('data/byte.tif') with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=10']) # FIXME? Should we eventually write the driver somewhere in metadata ? out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE, open_options=['TILE_FORMAT=PNG']) out_ds.BuildOverviews('NEAR', [2]) out_ds = None ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = out_ds.GetRasterBand(1).GetOverview(0).Checksum() assert got_cs == 1087 check_tile_format(out_ds, 'PNG', 3, False, zoom_level=0) # Check that there's no extensions out_ds = gdal.Open('/vsimem/tmp.gpkg') sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None # Test clearing overviews out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) out_ds.BuildOverviews('NONE', []) out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') assert out_ds.GetRasterBand(1).GetOverviewCount() == 0 out_ds = None # Test building on an overview dataset --> error out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() ret = out_ds.GetRasterBand(1).GetOverview(0).GetDataset().BuildOverviews('NONE', []) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building overview factor 1 --> error out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() ret = out_ds.BuildOverviews('NEAR', [1]) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building non-supported overview levels out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', 'NO') ret = out_ds.BuildOverviews('NEAR', [3]) gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', None) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building non-supported overview levels out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) gdal.PushErrorHandler() gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', 'NO') ret = out_ds.BuildOverviews('NEAR', [2, 4]) gdal.SetConfigOption('ALLOW_GPKG_ZOOM_OTHER_EXTENSION', None) gdal.PopErrorHandler() assert ret != 0 out_ds = None # Test building overviews on read-only dataset out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) gdal.PushErrorHandler() ret = out_ds.BuildOverviews('NEAR', [2]) gdal.PopErrorHandler() assert ret != 0 out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test overviews with 3 band dataset def test_gpkg_18(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, immediately after create copy ds = gdal.Open('data/small_world.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=100', 'BLOCKYSIZE=100']) out_ds.BuildOverviews('CUBIC', [2, 4]) out_ds = None tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tmp.tif', ds) tmp_ds.BuildOverviews('CUBIC', [2, 4]) expected_cs_ov0 = [tmp_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] expected_cs_ov1 = [tmp_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(3)] # tmp_ds.BuildOverviews('NEAR', [3]) # expected_cs_ov_factor3 = [tmp_ds.GetRasterBand(i+1).GetOverview(2).Checksum() for i in range(3)] tmp_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tmp.tif') ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] assert got_cs == expected_cs_ov0 got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(3)] assert got_cs == expected_cs_ov1 check_tile_format(out_ds, 'PNG', 3, False, zoom_level=1) check_tile_format(out_ds, 'PNG', 4, False, zoom_level=0) out_ds = None # Test gpkg_zoom_other extension out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) # We expect a warning gdal.PushErrorHandler() ret = out_ds.BuildOverviews('NEAR', [3]) gdal.PopErrorHandler() assert ret == 0 assert out_ds.GetRasterBand(1).GetOverviewCount() == 3 got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] assert got_cs == expected_cs_ov0 expected_cs = [24807, 25544, 34002] got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(3)] assert got_cs == expected_cs got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(2).Checksum() for i in range(3)] assert got_cs == expected_cs_ov1 # Check that extension is declared sql_lyr = out_ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'tmp' AND extension_name = 'gpkg_zoom_other'") assert sql_lyr.GetFeatureCount() == 1 out_ds.ReleaseResultSet(sql_lyr) out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') assert out_ds.GetRasterBand(1).GetOverviewCount() == 3 got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(3)] assert got_cs == expected_cs_ov0 expected_cs = [24807, 25544, 34002] got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(3)] assert got_cs == expected_cs got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(2).Checksum() for i in range(3)] assert got_cs == expected_cs_ov1 out_ds = None # Add terminating overview out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER | gdal.OF_UPDATE) ret = out_ds.BuildOverviews('NEAR', [8]) assert ret == 0 expected_cs = [12725, 12539, 13553] got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(3).Checksum() for i in range(3)] assert got_cs == expected_cs out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, immediately after create copy ds = gdal.Open('data/small_world.tif') with gdaltest.config_option('CREATE_METADATA_TABLES', 'NO'): out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=100', 'BLOCKYSIZE=100']) # Should not result in gpkg_zoom_other ret = out_ds.BuildOverviews('NEAR', [8]) assert ret == 0 out_ds = None # Check that there's no extensions out_ds = gdal.Open('/vsimem/tmp.gpkg') sql_lyr = out_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'") assert sql_lyr.GetFeatureCount() == 0 out_ds.ReleaseResultSet(sql_lyr) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test overviews with 24-bit color palette single band dataset def test_gpkg_19(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, immediately after create copy ds = gdal.Open('data/small_world_pct.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=100', 'BLOCKYSIZE=100']) out_ds.BuildOverviews('NEAR', [2, 4]) out_ds = None tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tmp.tif', ds) tmp_ds.BuildOverviews('NEAR', [2, 4]) expected_cs_ov0 = [tmp_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(1)] expected_cs_ov1 = [tmp_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(1)] tmp_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tmp.tif') ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER, open_options=['BAND_COUNT=1']) assert out_ds.GetRasterBand(1).GetOverview(0).GetColorTable() is not None got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(0).Checksum() for i in range(1)] assert got_cs == expected_cs_ov0 got_cs = [out_ds.GetRasterBand(i + 1).GetOverview(1).Checksum() for i in range(1)] assert got_cs == expected_cs_ov1 check_tile_format(out_ds, 'PNG', 1, True, zoom_level=1) check_tile_format(out_ds, 'PNG', 4, False, zoom_level=0) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test PNG8 def test_gpkg_20(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, with small tiles (<=256x256) ds = gdal.Open('data/small_world.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKSIZE=200']) out_ds = None ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [30875, 31451, 38110, 64269] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 1, True) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, with big tiles (>256x256) ds = gdal.Open('data/small_world.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKXSIZE=400', 'BLOCKYSIZE=200']) out_ds = None ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [27001, 30168, 34800, 64269] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 1, True) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # With and without padding, with small tiles ds = gdal.Open('data/small_world.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKSIZE=150']) out_ds = None ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [27718, 31528, 42062, 64269] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 1, True) check_tile_format(out_ds, 'PNG', 4, False, row=0, col=2) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Without padding, with small tiles (<=256x256), but especially less # than 256 colors. ds = gdal.GetDriverByName('MEM').Create('', 50, 50, 3) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(2).Fill(2) ds.GetRasterBand(3).Fill(3) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', ds, options=['TILE_FORMAT=PNG8', 'BLOCKSIZE=50']) out_ds = None ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [2500, 5000, 7500, 30658] assert got_cs == expected_cs check_tile_format(out_ds, 'PNG', 1, True) out_ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', gdal.OF_RASTER, open_options=['BAND_COUNT=1']) assert out_ds.GetRasterBand(1).GetColorTable().GetCount() == 1 out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Test metadata def test_gpkg_21(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1) out_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) mddlist = out_ds.GetMetadataDomainList() assert len(mddlist) == 3 out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) # No metadata for now sql_lyr = out_ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata'") feat = sql_lyr.GetNextFeature() out_ds.ReleaseResultSet(sql_lyr) feat_is_none = feat is None assert feat_is_none # Set a metadata item now out_ds.SetMetadataItem('foo', 'bar') out_ds = None foo_value = 'bar' for i in range(4): out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert not out_ds.GetMetadata('GEOPACKAGE') if out_ds.GetMetadataItem('foo') != foo_value: feat.DumpReadable() pytest.fail(out_ds.GetMetadataItem('foo')) md = out_ds.GetMetadata() if len(md) != 3 or md['foo'] != foo_value or \ md['IDENTIFIER'] != 'tmp' or md['ZOOM_LEVEL'] != '0': feat.DumpReadable() pytest.fail(md) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') feat = sql_lyr.GetNextFeature() if feat.GetField('id') != 1 or feat.GetField('md_scope') != 'dataset' or \ feat.GetField('md_standard_uri') != 'http://gdal.org' or \ feat.GetField('mime_type') != 'text/xml' or \ feat.GetField('metadata') != """ %s """ % foo_value: feat.DumpReadable() pytest.fail(i) out_ds.ReleaseResultSet(sql_lyr) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') feat = sql_lyr.GetNextFeature() if feat.GetField('reference_scope') != 'table' or \ feat.GetField('table_name') != 'tmp' or \ not feat.IsFieldNull('column_name') or \ not feat.IsFieldNull('row_id_value') or \ not feat.IsFieldSet('timestamp') or \ feat.GetField('md_file_id') != 1 or \ not feat.IsFieldNull('md_parent_id'): feat.DumpReadable() pytest.fail(i) out_ds.ReleaseResultSet(sql_lyr) if i == 1: out_ds.SetMetadataItem('foo', 'bar') elif i == 2: out_ds.SetMetadataItem('foo', 'baz') foo_value = 'baz' out_ds = None # Clear metadata out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) out_ds.SetMetadata(None) out_ds = None # No more metadata out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) out_ds.SetMetadataItem('IDENTIFIER', 'my_identifier') out_ds.SetMetadataItem('DESCRIPTION', 'my_description') out_ds = None # Still no metadata out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert out_ds.GetMetadataItem('IDENTIFIER') == 'my_identifier' assert out_ds.GetMetadataItem('DESCRIPTION') == 'my_description' sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) # Write metadata in global scope out_ds.SetMetadata({'bar': 'foo'}, 'GEOPACKAGE') out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert out_ds.GetMetadataItem('bar', 'GEOPACKAGE') == 'foo' sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata') feat = sql_lyr.GetNextFeature() if feat.GetField('id') != 1 or feat.GetField('md_scope') != 'dataset' or \ feat.GetField('md_standard_uri') != 'http://gdal.org' or \ feat.GetField('mime_type') != 'text/xml' or \ feat.GetField('metadata') != """ foo """: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference') feat = sql_lyr.GetNextFeature() if feat.GetField('reference_scope') != 'geopackage' or \ not feat.IsFieldNull('table_name') or \ not feat.IsFieldNull('column_name') or \ not feat.IsFieldNull('row_id_value') or \ not feat.IsFieldSet('timestamp') or \ feat.GetField('md_file_id') != 1 or \ not feat.IsFieldNull('md_parent_id'): feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) out_ds.SetMetadataItem('bar', 'baz', 'GEOPACKAGE') out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert out_ds.GetMetadataItem('bar', 'GEOPACKAGE') == 'baz' out_ds.SetMetadata(None, 'GEOPACKAGE') out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert not out_ds.GetMetadata('GEOPACKAGE') out_ds.SetMetadataItem('1', '2') out_ds.SetMetadataItem('3', '4', 'CUSTOM_DOMAIN') out_ds.SetMetadataItem('6', '7', 'GEOPACKAGE') # Non GDAL metadata out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (10, 'dataset', 'uri', 'text/plain', 'my_metadata')") out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('geopackage',NULL,NULL,NULL,'2012-08-17T14:49:32.932Z',10,NULL)") out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (11, 'dataset', 'uri', 'text/plain', 'other_metadata')") out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('geopackage',NULL,NULL,NULL,'2012-08-17T14:49:32.932Z',11,NULL)") out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (12, 'dataset', 'uri', 'text/plain', 'my_metadata_local')") out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('table','tmp',NULL,NULL,'2012-08-17T14:49:32.932Z',12,NULL)") out_ds.ExecuteSQL("INSERT INTO gpkg_metadata VALUES (13, 'dataset', 'uri', 'text/plain', 'other_metadata_local')") out_ds.ExecuteSQL("INSERT INTO gpkg_metadata_reference VALUES ('table','tmp',NULL,NULL,'2012-08-17T14:49:32.932Z',13,NULL)") out_ds = None for i in range(2): out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert out_ds.GetMetadataItem('1') == '2' assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_1') == 'my_metadata_local', \ out_ds.GetMetadata() assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_2') == 'other_metadata_local', \ out_ds.GetMetadata() assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_1', 'GEOPACKAGE') == 'my_metadata', \ out_ds.GetMetadata('GEOPACKAGE') assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_2', 'GEOPACKAGE') == 'other_metadata', \ out_ds.GetMetadata('GEOPACKAGE') assert out_ds.GetMetadataItem('3', 'CUSTOM_DOMAIN') == '4' assert out_ds.GetMetadataItem('6', 'GEOPACKAGE') == '7' out_ds.SetMetadata(out_ds.GetMetadata()) out_ds.SetMetadata(out_ds.GetMetadata('GEOPACKAGE'), 'GEOPACKAGE') out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) out_ds.SetMetadata(None) out_ds.SetMetadata(None, 'CUSTOM_DOMAIN') out_ds.SetMetadata(None, 'GEOPACKAGE') out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) assert out_ds.GetMetadataItem('GPKG_METADATA_ITEM_1', 'GEOPACKAGE') == 'my_metadata', \ out_ds.GetMetadata() sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata WHERE id < 10') feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) sql_lyr = out_ds.ExecuteSQL('SELECT * FROM gpkg_metadata_reference WHERE md_file_id < 10') feat = sql_lyr.GetNextFeature() if feat is not None: feat.DumpReadable() out_ds.ReleaseResultSet(sql_lyr) pytest.fail() out_ds.ReleaseResultSet(sql_lyr) out_ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Two band, PNG def get_georeferenced_greyalpha_ds(): src_ds = gdal.Open('../gcore/data/stefan_full_greyalpha.tif') tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tmp.tif', src_ds.RasterXSize, src_ds.RasterYSize, 2) tmp_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize)) return tmp_ds def test_gpkg_22(tile_drv_name='PNG'): if gdaltest.gpkg_dr is None: pytest.skip() if tile_drv_name is None: tile_drv = gdaltest.png_dr if gdaltest.jpeg_dr is None: pytest.skip() expected_cs = [2466, 10807] clamped_expected_cs = [1989, 1989, 1989, 11580] if tile_drv_name == 'PNG': tile_drv = gdaltest.png_dr expected_cs = [1970, 10807] clamped_expected_cs = [2100, 2100, 2100, 11580] elif tile_drv_name == 'JPEG': tile_drv = gdaltest.jpeg_dr expected_cs = [6782, 32706] clamped_expected_cs = [6538, 6538, 6538, 32744] elif tile_drv_name == 'WEBP': tile_drv = gdaltest.webp_dr if gdaltest.webp_supports_rgba: expected_cs = [13112, 10807] clamped_expected_cs = [13380, 13380, 13380, 11580] else: expected_cs = [13112, 32706] clamped_expected_cs = [13380, 13380, 13380, 32744] if tile_drv is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') tmp_ds = get_georeferenced_greyalpha_ds() if tile_drv_name: options = ['TILE_FORMAT=' + tile_drv_name, 'BLOCKSIZE=16'] else: options = ['BLOCKSIZE=16'] out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', tmp_ds, options=options) tmp_ds_filename = tmp_ds.GetDescription() ds = None gdal.Unlink(tmp_ds_filename) out_ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=2']) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(2)] if got_cs != expected_cs: assert tile_drv_name == 'WEBP' and got_cs in ([4899, 10807], [6274, 10807], [17638, 10807]) out_ds = None out_ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [expected_cs[0], expected_cs[0], expected_cs[0], expected_cs[1]] if got_cs != expected_cs: assert tile_drv_name == 'WEBP' and got_cs in ([4899, 4899, 4899, 10807], [4899, 4984, 4899, 10807], [6274, 6274, 6274, 10807], [17638, 17631, 17638, 10807]) out_ds = None ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['USE_TILE_EXTENT=YES']) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] if got_cs != clamped_expected_cs: assert tile_drv_name == 'WEBP' and got_cs in ([5266, 5266, 5266, 11580], [5266, 5310, 5266, 11580], [6436, 6436, 6436, 11580], [17007, 17000, 17007, 11580]) ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # Two band, JPEG def test_gpkg_23(): return test_gpkg_22(tile_drv_name='JPEG') ############################################################################### # Two band, WEBP def test_gpkg_24(): return test_gpkg_22(tile_drv_name='WEBP') ############################################################################### # Two band, mixed def test_gpkg_25(): return test_gpkg_22(tile_drv_name=None) ############################################################################### # Test TILING_SCHEME def test_gpkg_26(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') tests = [('CUSTOM', [4672, 4672, 4672, 4873], None), ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], None), ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], ['RESAMPLING=BILINEAR']), ('GoogleCRS84Quad', [3417, 3417, 3417, 3691], ['RESAMPLING=CUBIC']), ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], ['ZOOM_LEVEL_STRATEGY=AUTO']), ('GoogleCRS84Quad', [14445, 14445, 14445, 14448], ['ZOOM_LEVEL_STRATEGY=UPPER']), ('GoogleCRS84Quad', [3562, 3562, 3562, 3691], ['ZOOM_LEVEL_STRATEGY=LOWER']), ('GoogleMapsCompatible', [4118, 4118, 4118, 4406], None), ('PseudoTMS_GlobalGeodetic', [3562, 3562, 3562, 3691], None), ('PseudoTMS_GlobalMercator', [4118, 4118, 4118, 4406], None)] for (scheme, expected_cs, other_options) in tests: src_ds = gdal.Open('data/byte.tif') options = ['TILE_FORMAT=PNG', 'TILING_SCHEME=' + scheme] if other_options: options = options + other_options ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=options) ds = None ds = gdal.Open('/vsimem/tmp.gpkg') assert ds.GetMetadataItem('AREA_OR_POINT') == 'Area' got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] # VC12 returns [3561, 3561, 3561, 3691] for GoogleCRS84Quad # and For GoogleCRS84Quad RESAMPLING=CUBIC, got [3415, 3415, 3415, 3691] if max([abs(got_cs[i] - expected_cs[i]) for i in range(4)]) > 2: print('For %s, got %s, expected %s' % (scheme, str(got_cs), str(expected_cs))) assert gdal.GetConfigOption('APPVEYOR') is not None ds = None gdal.Unlink('/vsimem/tmp.gpkg') tests = [('GoogleCRS84Quad', [[42255, 47336, 24963, 35707], [42255, 47336, 24965, 35707], [42253, 47333, 24961, 35707], [42253, 47334, 24963, 35707], # s390x ], None), ('GoogleMapsCompatible', [[35429, 36787, 20035, 17849]], None)] for (scheme, expected_cs, other_options) in tests: src_ds = gdal.Open('data/small_world.tif') options = ['TILE_FORMAT=PNG', 'TILING_SCHEME=' + scheme] if other_options: options = options + other_options ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=options) ds = None ds = gdal.Open('/vsimem/tmp.gpkg') got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] if got_cs not in expected_cs: print('For %s, got %s, expected %s' % (scheme, str(got_cs), str(expected_cs))) assert gdal.GetConfigOption('APPVEYOR') is not None ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Test a few error cases gdal.PushErrorHandler() ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 1, options=['TILING_SCHEME=GoogleCRS84Quad', 'BLOCKSIZE=128']) gdal.PopErrorHandler() assert ds is None gdal.Unlink('/vsimem/tmp.gpkg') ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 1, options=['TILING_SCHEME=GoogleCRS84Quad']) # Test that implicit SRS registration works. assert ds.GetProjectionRef().find('4326') >= 0 gdal.PushErrorHandler() ret = ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) gdal.PopErrorHandler() assert ret != 0 srs = osr.SpatialReference() srs.ImportFromEPSG(32630) gdal.PushErrorHandler() ret = ds.SetProjection(srs.ExportToWkt()) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ds = None gdal.PopErrorHandler() gdal.Unlink('/vsimem/tmp.gpkg') # Test with a .json tile matrix set ds = gdal.Translate('/vsimem/tmp.gpkg', '../gdrivers/data/small_world.tif', options='-of GPKG -co TILING_SCHEME=LINZAntarticaMapTileGrid -projwin -180 -50 180 -90') assert ds.GetSpatialRef().GetAuthorityCode(None) == '5482' assert ds.GetGeoTransform() == pytest.approx(((314023.27126670163, 28672, 0.0, 5685976.728733298, 0.0, -28672)), abs=1e-8) ds = None gdal.Unlink('/vsimem/tmp.gpkg') # Unsupported TILING_SCHEME src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): assert gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILING_SCHEME=NZTM2000']) is None gdal.Unlink('/vsimem/tmp.gpkg') # Invalid TILING_SCHEME src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): assert gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILING_SCHEME=invalid']) is None gdal.Unlink('/vsimem/tmp.gpkg') # Invalid target filename src_ds = gdal.Open('data/byte.tif') gdal.PushErrorHandler() ds = gdaltest.gpkg_dr.CreateCopy('/foo/tmp.gpkg', src_ds, options=['TILING_SCHEME=GoogleCRS84Quad']) gdal.PopErrorHandler() assert ds is None # Source is not georeferenced src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') gdal.PushErrorHandler() ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILING_SCHEME=GoogleCRS84Quad']) gdal.PopErrorHandler() assert ds is None ############################################################################### # Test behaviour with low block cache max def test_gpkg_27(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') oldSize = gdal.GetCacheMax() gdal.SetCacheMax(0) src_ds = gdal.Open('data/small_world.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=200', 'BLOCKYSIZE=200']) gdal.SetCacheMax(oldSize) expected_cs = [src_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs ############################################################################### # Test that reading a block in a band doesn't wipe another band of the same # block that would have gone through the GPKG in-memory cache def test_gpkg_28(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') src_ds = gdal.Open('data/small_world.tif') data = [] for b in range(3): data.append(src_ds.GetRasterBand(b + 1).ReadRaster()) expected_cs = [src_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] src_ds = None out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 400, 200, 3, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=400', 'BLOCKYSIZE=200']) out_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) out_ds.GetRasterBand(1).WriteRaster(0, 0, 400, 200, data[0]) # Force the block to go through IWriteBlock() oldSize = gdal.GetCacheMax() gdal.SetCacheMax(0) gdal.SetCacheMax(oldSize) # Read (another, but could be any) band out_ds.GetRasterBand(2).ReadRaster(0, 0, 400, 200) # Write remaining bands 2 and 3 for b in range(2): out_ds.GetRasterBand(b + 2).WriteRaster(0, 0, 400, 200, data[b + 1]) out_ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=3']) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs ############################################################################### # Variation of gpkg_28 with 2 blocks def test_gpkg_29(x=0): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') src_ds = gdal.Open('data/small_world.tif') left = [] right = [] for b in range(3): left.append(src_ds.GetRasterBand(b + 1).ReadRaster(0, 0, 200, 200)) right.append(src_ds.GetRasterBand(b + 1).ReadRaster(200, 0, 200, 200)) expected_cs = [src_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] src_ds = None out_ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 400, 200, 3, options=['TILE_FORMAT=PNG', 'BLOCKXSIZE=200', 'BLOCKYSIZE=200']) out_ds.SetGeoTransform([0, 10, 0, 0, 0, -10]) out_ds.GetRasterBand(1).WriteRaster(0, 0, 200, 200, left[0]) # Force the block to go through IWriteBlock() oldSize = gdal.GetCacheMax() gdal.SetCacheMax(0) gdal.SetCacheMax(oldSize) out_ds.GetRasterBand(2).ReadRaster(x, 0, 200, 200) for b in range(2): out_ds.GetRasterBand(b + 2).WriteRaster(0, 0, 200, 200, left[b + 1]) for b in range(3): out_ds.GetRasterBand(b + 1).WriteRaster(200, 0, 200, 200, right[b]) out_ds = None out_ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=3']) got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(3)] assert got_cs == expected_cs ############################################################################### # Variation of gpkg_29 where the read is done in another block def test_gpkg_30(): return test_gpkg_29(x=200) ############################################################################### # 1 band to RGBA def test_gpkg_31(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # Force use of RGBA instead of Grey-Alpha (the natural use case is WEBP) # but here we can test losslessly gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', 'NO') gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', gdal.Open('data/byte.tif'), options=['TILE_FORMAT=PNG', 'BLOCKSIZE=21']) gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', None) ds = gdal.Open('/vsimem/tmp.gpkg') check_tile_format(ds, 'PNG', 4, False) expected_cs = [4672, 4672, 4672, 4873] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ############################################################################### # grey-alpha to RGBA def test_gpkg_32(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # Force use of RGBA instead of Grey-Alpha (the natural use case is WEBP) # but here we can test losslessly gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', 'NO') gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', get_georeferenced_greyalpha_ds(), options=['TILE_FORMAT=PNG', 'BLOCKSIZE=200']) gdal.SetConfigOption('GPKG_PNG_SUPPORTS_2BANDS', None) ds = gdal.Open('/vsimem/tmp.gpkg') check_tile_format(ds, 'PNG', 4, False) expected_cs = [1970, 1970, 1970, 10807] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == expected_cs ds = gdal.OpenEx('/vsimem/tmp.gpkg', open_options=['BAND_COUNT=2']) expected_cs = [1970, 10807] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == expected_cs ############################################################################### # Single band with 32 bit color table -> RGBA def test_gpkg_33(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') # Force use of RGBA instead of color-table (the natural use case is WEBP) # but here we can test losslessly gdal.SetConfigOption('GPKG_PNG_SUPPORTS_CT', 'NO') src_ds = get_georeferenced_ds_with_pct32() gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG']) gdal.SetConfigOption('GPKG_PNG_SUPPORTS_CT', None) gdal.Unlink(src_ds.GetDescription()) ds = gdal.Open('/vsimem/tmp.gpkg') check_tile_format(ds, 'PNG', 4, False) expected_cs = [10991, 57677, 34965, 10638] got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs ############################################################################### # Test partial tiles with overviews (#6335) def test_gpkg_34(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') src_ds = gdal.GetDriverByName('MEM').Create('', 512, 417) src_ds.SetGeoTransform([-20037508.342789299786091, 2 * 20037508.342789299786091 / 512, 0, 16213801.067584000527859, 0, -2 * 16213801.067584000527859 / 417]) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) src_ds.SetProjection(srs.ExportToWkt()) gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'TILING_SCHEME=GoogleMapsCompatible']) ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) gdal.ErrorReset() ds.BuildOverviews('NEAR', [2]) ds = None assert gdal.GetLastErrorMsg() == '' ############################################################################### # Test dirty block flushing while reading block (#6365) def test_gpkg_35(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') src_ds = gdal.GetDriverByName('MEM').Create('', 512, 417, 4) src_ds.SetGeoTransform([-20037508.342789299786091, 2 * 20037508.342789299786091 / 512, 0, 16213801.067584000527859, 0, -2 * 16213801.067584000527859 / 417]) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) src_ds.SetProjection(srs.ExportToWkt()) out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/tmp.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'TILING_SCHEME=GoogleMapsCompatible']) out_ds.GetRasterBand(1).Fill(32) out_ds.GetRasterBand(2).Fill(64) out_ds.GetRasterBand(3).Fill(128) out_ds.GetRasterBand(4).Fill(255) height = out_ds.RasterYSize expected_data = out_ds.ReadRaster(0, 0, 256, height) out_ds = None src_ds = gdal.GetDriverByName('MEM').Create('', 256, height, 4) src_ds.GetRasterBand(1).Fill(255) src_ds.GetRasterBand(2).Fill(255) src_ds.GetRasterBand(3).Fill(255) src_ds.GetRasterBand(4).Fill(255) white_data = src_ds.ReadRaster(0, 0, 256, height) ds = gdal.Open('/vsimem/tmp.gpkg', gdal.GA_Update) ds.WriteRaster(256, 0, 256, height, white_data) oldSize = gdal.GetCacheMax() # + 2 * 128 > + 2 * sizeof(GDALRasterBlock). Cf gdalrasterblock.cpp:GetEffectiveBlockSize() gdal.SetCacheMax((256 * 256 + 2 * 128) * 4) got_data = ds.ReadRaster(0, 0, 256, height) gdal.SetCacheMax(oldSize) assert got_data == expected_data ############################################################################### # Single band with 24 bit color table, PNG, GoogleMapsCompatible def test_gpkg_36(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() src_ds = gdal.Open('data/small_world_pct.tif') out_ds = gdaltest.gpkg_dr.CreateCopy('/vsimem/gpkg_36.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'TILING_SCHEME=GoogleMapsCompatible', 'RESAMPLING=NEAREST']) out_ds = None src_ds = None expected_cs = [993, 50461, 64354, 17849] out_ds = gdal.Open('/vsimem/gpkg_36.gpkg') got_cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(4)] assert got_cs == expected_cs got_ct = out_ds.GetRasterBand(1).GetColorTable() assert got_ct is None out_ds = None gdal.Unlink('/vsimem/gpkg_36.gpkg') ############################################################################### # Test that we don't crash when generating big overview factors on rasters with big dimensions # due to issues in comparing the factor of overviews with the user specified # factors def test_gpkg_37(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdal.GetDriverByName('GPKG').Create('/vsimem/gpkg_37.gpkg', 205000, 200000) ds.SetGeoTransform([100, 0.000001, 0, 100, 0, -0.000001]) ds = None ds = gdal.Open('/vsimem/gpkg_37.gpkg', gdal.GA_Update) ret = ds.BuildOverviews('NONE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]) assert ret == 0 and gdal.GetLastErrorMsg() == '' ds = None gdal.Unlink('/vsimem/gpkg_37.gpkg') ############################################################################### # Test generating more than 1000 tiles def test_gpkg_38(): if gdaltest.gpkg_dr is None: pytest.skip() # Without padding, immediately after create copy src_ds = gdal.Open('data/small_world.tif') gdaltest.gpkg_dr.CreateCopy('/vsimem/gpkg_38.gpkg', src_ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=8']) ds = gdal.Open('/vsimem/gpkg_38.gpkg') assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() ds = None filesize = gdal.VSIStatL('/vsimem/gpkg_38.gpkg').size gdal.Unlink('/vsimem/gpkg_38.gpkg') filename = '/vsimem/||maxlength=%d||gpkg_38.gpkg' % (filesize - 100000) with gdaltest.error_handler(): ds = gdaltest.gpkg_dr.CreateCopy(filename, src_ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=8']) ds_is_none = ds is None ds = None gdal.Unlink(filename) assert ds_is_none or gdal.GetLastErrorMsg() != '' filename = '/vsimem/||maxlength=%d||gpkg_38.gpkg' % (filesize - 1) with gdaltest.error_handler(): ds = gdaltest.gpkg_dr.CreateCopy(filename, src_ds, options=['TILE_FORMAT=PNG', 'BLOCKSIZE=8']) ds_is_none = ds is None ds = None gdal.Unlink(filename) assert ds_is_none or gdal.GetLastErrorMsg() != '' ############################################################################### # Test tile gridded coverage data def test_gpkg_39(): if gdaltest.gpkg_dr is None: pytest.skip() src_ds = gdal.Open('data/int16.tif') gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG') assert validate('/vsimem/gpkg_39.gpkg'), 'validation failed' ds = gdal.Open('/vsimem/gpkg_39.gpkg') # Check there a ogr_empty_table sql_lyr = ds.ExecuteSQL("SELECT COUNT(*) FROM sqlite_master WHERE name = 'ogr_empty_table'") f = sql_lyr.GetNextFeature() assert f.GetField(0) == 1 ds.ReleaseResultSet(sql_lyr) assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16 assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetMetadataItem('AREA_OR_POINT') == 'Area' sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') f = sql_lyr.GetNextFeature() if f['scale'] != 1.0: f.DumpReadable() pytest.fail() if f['offset'] != 0.0: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('SELECT grid_cell_encoding FROM gpkg_2d_gridded_coverage_ancillary') f = sql_lyr.GetNextFeature() if f['grid_cell_encoding'] != 'grid-value-is-area': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) # No metadata for now sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata'") feat = sql_lyr.GetNextFeature() ds.ReleaseResultSet(sql_lyr) feat_is_none = feat is None assert feat_is_none sql_lyr = ds.ExecuteSQL('PRAGMA application_id') f = sql_lyr.GetNextFeature() if f['application_id'] != 1196444487: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('PRAGMA user_version') f = sql_lyr.GetNextFeature() if f['user_version'] != 10200: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) # Statistics not available on partial tile without nodata md = ds.GetRasterBand(1).GetMetadata() assert md == {} ds = None # From a AREA_OR_POINT=Point dataset gdal.Translate('/vsimem/gpkg_39.gpkg', 'data/n43.dt0', format='GPKG') ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', ds.GetMetadata() assert ds.GetRasterBand(1).GetUnitType() == 'm' ds = None # Test GRID_CELL_ENCODING=grid-value-is-corner gdal.Translate('/vsimem/gpkg_39.gpkg', 'data/byte.tif', format='GPKG', outputType=gdal.GDT_UInt16, creationOptions=['GRID_CELL_ENCODING=grid-value-is-corner']) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetMetadataItem('AREA_OR_POINT') == 'Point', ds.GetMetadata() assert ds.GetRasterBand(1).GetMetadataItem('GRID_CELL_ENCODING') == 'grid-value-is-corner' # No metadata for now sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata'") feat = sql_lyr.GetNextFeature() ds.ReleaseResultSet(sql_lyr) feat_is_none = feat is None assert feat_is_none ds = None # With nodata: statistics available gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=0) ds = gdal.Open('/vsimem/gpkg_39.gpkg') md = ds.GetRasterBand(1).GetMetadata() assert md == {'STATISTICS_MINIMUM': '74', 'STATISTICS_MAXIMUM': '255'} ds = None ds = gdal.Open('/vsimem/gpkg_39.gpkg') mdi = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') assert mdi == '74' ds = None # Entire tile: statistics available gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', width=256, height=256) ds = gdal.Open('/vsimem/gpkg_39.gpkg') md = ds.GetRasterBand(1).GetMetadata() assert md == {'STATISTICS_MINIMUM': '74', 'STATISTICS_MAXIMUM': '255'} ds = None ds = gdal.Open('/vsimem/gpkg_39.gpkg') mdi = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') assert mdi == '74' ds = None gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == -32768.0 gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=74) ds = gdal.Open('/vsimem/gpkg_39.gpkg') cs = ds.GetRasterBand(1).Checksum() assert cs == 4649 assert ds.GetRasterBand(1).GetNoDataValue() == -32768.0 gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1, creationOptions=['TILING_SCHEME=GoogleMapsCompatible']) ds = gdal.Open('/vsimem/gpkg_39.gpkg') cs = ds.GetRasterBand(1).Checksum() assert cs == 4118 or cs == 4077 gdal.SetConfigOption('GPKG_ADD_DEFINITION_12_063', 'YES') gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1, creationOptions=['TILING_SCHEME=GoogleMapsCompatible']) gdal.SetConfigOption('GPKG_ADD_DEFINITION_12_063', None) ds = gdal.Open('/vsimem/gpkg_39.gpkg') cs = ds.GetRasterBand(1).Checksum() assert cs == 4118 or cs == 4077 gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', width=1024, height=1024) ds = gdal.Open('/vsimem/gpkg_39.gpkg', gdal.GA_Update) ds.BuildOverviews('NEAR', [2, 4]) assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 37308 ds.BuildOverviews('NONE', []) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).GetOverviewCount() == 0 gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', outputType=gdal.GDT_UInt16) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).Checksum() == 4672 sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') f = sql_lyr.GetNextFeature() assert f['scale'] == 1.0 ds.ReleaseResultSet(sql_lyr) gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', outputType=gdal.GDT_UInt16, noData=1) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == 1.0 gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', outputType=gdal.GDT_UInt16, noData=74) ds = gdal.Open('/vsimem/gpkg_39.gpkg') cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == 74.0 src_ds = gdal.Open('data/float32.tif') gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG') ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).Checksum() == 4672 sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') f = sql_lyr.GetNextFeature() assert f.GetField('scale') == 1.0 ds.ReleaseResultSet(sql_lyr) gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=1) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetRasterBand(1).GetNoDataValue() == 1 gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', creationOptions=['TILE_FORMAT=PNG']) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).Checksum() == 4672 sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') f = sql_lyr.GetNextFeature() assert f['scale'] != 1.0 and f.IsFieldSetAndNotNull('scale') ds.ReleaseResultSet(sql_lyr) gdal.Translate('/vsimem/gpkg_39.gpkg', src_ds, format='GPKG', noData=74, creationOptions=['TILE_FORMAT=PNG']) ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).GetNoDataValue() == pytest.approx(-3.4028234663852885981e+38, rel=1e-8) cs = ds.GetRasterBand(1).Checksum() assert cs == 4651 sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') f = sql_lyr.GetNextFeature() assert f['scale'] != 1.0 and f.IsFieldSetAndNotNull('scale') ds.ReleaseResultSet(sql_lyr) # Particular case with nodata = -32768 for Int16 gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', """ncols 6 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value -32768 -32768 -32767 -32766 0 32766 32767""") gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_Int16) src_ds = gdal.Open('/vsimem/gpkg_39.asc') ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16 assert ds.GetRasterBand(1).GetNoDataValue() == -32768.0 assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None gdal.Unlink('/vsimem/gpkg_39.asc') # Particular case with nodata = 65535 for UInt16 gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', """ncols 6 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value 65535 0 1 2 65533 65534 65535""") gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_UInt16) src_ds = gdal.Open('/vsimem/gpkg_39.asc') ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).GetNoDataValue() == 65535.0 assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None gdal.Unlink('/vsimem/gpkg_39.asc') # Particular case with nodata = 0 for UInt16 gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', """ncols 6 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value 0 0 1 2 65533 65534 65535""") gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_UInt16) src_ds = gdal.Open('/vsimem/gpkg_39.asc') ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16 assert ds.GetRasterBand(1).GetNoDataValue() == 0 assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None gdal.Unlink('/vsimem/gpkg_39.asc') # Test large dynamic for Float32 and TILE_FORMAT=PNG gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', """ncols 2 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 -100000 100000""") gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_Float32, creationOptions=['TILE_FORMAT=PNG']) assert validate('/vsimem/gpkg_39.gpkg'), 'validation failed' src_ds = gdal.Open('/vsimem/gpkg_39.asc') ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None gdal.Unlink('/vsimem/gpkg_39.asc') # Test large dynamic for Float32 and TILE_FORMAT=PNG and nodata gdal.FileFromMemBuffer('/vsimem/gpkg_39.asc', """ncols 2 nrows 1 xllcorner 440720 yllcorner 3750120 cellsize 60 -100000 100000""") gdal.Translate('/vsimem/gpkg_39.gpkg', '/vsimem/gpkg_39.asc', format='GPKG', outputType=gdal.GDT_Float32, noData=0, creationOptions=['TILE_FORMAT=PNG']) src_ds = gdal.Open('/vsimem/gpkg_39.asc') ds = gdal.Open('/vsimem/gpkg_39.gpkg') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float32 assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ ds.GetRasterBand(1).GetNoDataValue() ds = None src_ds = None gdal.Unlink('/vsimem/gpkg_39.asc') # Test that we can delete an existing tile ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_39.gpkg', 256, 256, 1, gdal.GDT_UInt16) ds.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) ds.GetRasterBand(1).SetNoDataValue(0) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).FlushCache() ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(1).FlushCache() sql_lyr = ds.ExecuteSQL('SELECT scale, offset FROM gpkg_2d_gridded_tile_ancillary') f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/gpkg_39.gpkg') # Test detecting tiles at zero (without nodata value) ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_39.gpkg', 256, 256, 1, gdal.GDT_Float32) ds.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(1).FlushCache() sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_39') f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/gpkg_39.gpkg') # Test detecting tiles at nodata value ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_39.gpkg', 256, 256, 1, gdal.GDT_Float32) ds.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) ds.GetRasterBand(1).SetNoDataValue(2) ds.GetRasterBand(1).Fill(2) ds.GetRasterBand(1).FlushCache() sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_39') f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/gpkg_39.gpkg') gdal.Unlink('/vsimem/gpkg_39.gpkg.aux.xml') ############################################################################### # Test VERSION def test_gpkg_40(): if gdaltest.gpkg_dr is None: pytest.skip() src_ds = gdal.Open('data/byte.tif') # Should default to 1.2 gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG') ds = gdal.Open('/vsimem/gpkg_40.gpkg') sql_lyr = ds.ExecuteSQL('PRAGMA application_id') f = sql_lyr.GetNextFeature() if f['application_id'] != 1196444487: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('PRAGMA user_version') f = sql_lyr.GetNextFeature() if f['user_version'] != 10200: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None # Should default to 1.2 if we didn't override it. gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG', outputType=gdal.GDT_Int16, creationOptions=['VERSION=1.0']) ds = gdal.Open('/vsimem/gpkg_40.gpkg') sql_lyr = ds.ExecuteSQL('PRAGMA application_id') f = sql_lyr.GetNextFeature() if f['application_id'] != 1196437808: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('PRAGMA user_version') f = sql_lyr.GetNextFeature() if f['user_version'] != 0: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG', creationOptions=['VERSION=1.1']) ds = gdal.Open('/vsimem/gpkg_40.gpkg') sql_lyr = ds.ExecuteSQL('PRAGMA application_id') f = sql_lyr.GetNextFeature() if f['application_id'] != 1196437809: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('PRAGMA user_version') f = sql_lyr.GetNextFeature() if f['user_version'] != 0: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Translate('/vsimem/gpkg_40.gpkg', src_ds, format='GPKG', creationOptions=['VERSION=1.2']) ds = gdal.Open('/vsimem/gpkg_40.gpkg') sql_lyr = ds.ExecuteSQL('PRAGMA application_id') f = sql_lyr.GetNextFeature() if f['application_id'] != 1196444487: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('PRAGMA user_version') f = sql_lyr.GetNextFeature() if f['user_version'] != 10200: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/gpkg_40.gpkg') ############################################################################### # Robustness test def test_gpkg_41(): if gdaltest.gpkg_dr is None or gdal.GetConfigOption('TRAVIS') is not None or \ gdal.GetConfigOption('APPVEYOR') is not None: pytest.skip() gdal.SetConfigOption('GPKG_ALLOW_CRAZY_SETTINGS', 'YES') with gdaltest.error_handler(): gdal.Translate('/vsimem/gpkg_41.gpkg', 'data/gpkg/huge_line.tif', format='GPKG', creationOptions=[ 'BLOCKXSIZE=500000000', 'BLOCKYSIZE=1']) gdal.SetConfigOption('GPKG_ALLOW_CRAZY_SETTINGS', None) gdal.Unlink('/vsimem/gpkg_41.gpkg') ############################################################################### # Test opening in vector mode a database without gpkg_geometry_columns def test_gpkg_42(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.SetConfigOption('CREATE_GEOMETRY_COLUMNS', 'NO') gdal.Translate('/vsimem/gpkg_42.gpkg', 'data/byte.tif', format='GPKG') gdal.SetConfigOption('CREATE_GEOMETRY_COLUMNS', None) ds = gdal.OpenEx('/vsimem/gpkg_42.gpkg', gdal.OF_VECTOR | gdal.OF_UPDATE) sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_geometry_columns'") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 lyr = ds.CreateLayer('test') assert lyr is not None ds.FlushCache() assert gdal.GetLastErrorMsg() == '' ds = None gdal.Unlink('/vsimem/gpkg_42.gpkg') ############################################################################### # Test adding raster to a database without pre-existing raster support tables. def test_gpkg_43(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.SetConfigOption('CREATE_RASTER_TABLES', 'NO') ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_43.gpkg', 0, 0, 0, gdal.GDT_Unknown) gdal.SetConfigOption('CREATE_RASTER_TABLES', None) ds.CreateLayer('foo') ds = None ds = gdal.OpenEx('/vsimem/gpkg_43.gpkg', gdal.OF_UPDATE) sql_lyr = ds.ExecuteSQL("SELECT 1 FROM sqlite_master WHERE name = 'gpkg_tile_matrix_set'") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 ds = None gdal.Translate('/vsimem/gpkg_43.gpkg', 'data/byte.tif', format='GPKG', creationOptions=['APPEND_SUBDATASET=YES']) ds = gdal.OpenEx('/vsimem/gpkg_43.gpkg') assert ds.GetRasterBand(1).Checksum() == 4672 assert ds.GetLayerCount() == 1 ds = None assert validate('/vsimem/gpkg_43.gpkg'), 'validation failed' gdal.Unlink('/vsimem/gpkg_43.gpkg') ############################################################################### # Test opening a .gpkg.sql file def test_gpkg_44(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': pytest.skip() ds = gdal.Open('data/gpkg/byte.gpkg.sql') assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' ############################################################################### # Test opening a .gpkg file def test_gpkg_45(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdal.Open('data/gpkg/byte.gpkg') assert ds.GetRasterBand(1).Checksum() == 4672, 'validation failed' ############################################################################### # Test fix for #6932 def test_gpkg_46(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.Create('/vsimem/gpkg_46.gpkg', 6698, 6698, options=['TILING_SCHEME=GoogleMapsCompatible']) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) ds.SetProjection(srs.ExportToWkt()) ds.SetGeoTransform([500, 0.037322767717371, 0, 750, 0, -0.037322767717371]) ds = None ds = gdal.Open('/vsimem/gpkg_46.gpkg', gdal.GA_Update) ds.BuildOverviews('NEAR', [2, 4, 8, 16, 32, 64, 128, 256]) ds = None ds = gdal.Open('/vsimem/gpkg_46.gpkg') sql_lyr = ds.ExecuteSQL('SELECT zoom_level, matrix_width * pixel_x_size * tile_width, matrix_height * pixel_y_size * tile_height FROM gpkg_tile_matrix ORDER BY zoom_level') count = 0 for f in sql_lyr: count += 1 if f.GetField(1) != pytest.approx(40075016.6855785, abs=1e-7) or \ f.GetField(2) != pytest.approx(40075016.6855785, abs=1e-7): f.DumpReadable() ds.ReleaseResultSet(sql_lyr) gdal.Unlink('/vsimem/gpkg_46.gpkg') pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/gpkg_46.gpkg') assert count == 23 ############################################################################### # Test fix for #6976 def test_gpkg_47(): if gdaltest.gpkg_dr is None: pytest.skip() tmpfile = '/vsimem/gpkg_47.gpkg' ds = gdaltest.gpkg_dr.CreateCopy(tmpfile, gdal.Open('data/byte.tif')) ds.ExecuteSQL('UPDATE gpkg_contents SET min_x = 1, max_x = 0') ds = None with gdaltest.error_handler(): ds = gdal.Open(tmpfile) assert ds.RasterXSize == 256 ds = None gdal.Unlink(tmpfile) ############################################################################### # Test fix for https://issues.qgis.org/issues/16997 (opening a file with # subdatasets on Windows) def test_gpkg_48(): if gdaltest.gpkg_dr is None: pytest.skip() if sys.platform == 'win32': filename = os.path.join(os.getcwd(), 'tmp', 'byte.gpkg') else: # Test Windows code path in a weird way... filename = 'C:\\byte.gpkg' gdal.Translate(filename, 'data/byte.tif', format='GPKG', creationOptions=['RASTER_TABLE=foo']) gdal.Translate(filename, 'data/byte.tif', format='GPKG', creationOptions=['APPEND_SUBDATASET=YES', 'RASTER_TABLE=bar']) ds = gdal.Open('GPKG:' + filename + ':foo') if ds is None: gdal.Unlink(filename) pytest.fail() ds = None ds = gdal.Open('GPKG:' + filename + ':bar') if ds is None: gdal.Unlink(filename) pytest.fail() ds = None gdal.Unlink(filename) ############################################################################### def test_gpkg_delete_raster_layer(): if gdaltest.gpkg_dr is None: pytest.skip() filename = '/vsimem/byte.gpkg' gdal.Translate(filename, 'data/byte.tif', format='GPKG', creationOptions=['RASTER_TABLE=foo']) ds = ogr.Open(filename, update=1) ds.ExecuteSQL('DROP TABLE foo') sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_metadata') fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) ds.ExecuteSQL('VACUUM') ds = None assert fc == 0 # Check that there is no more any reference to the layer f = gdal.VSIFOpenL(filename, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert 'foo' not in content gdal.Unlink(filename) ############################################################################### def test_gpkg_delete_gridded_coverage_raster_layer(): if gdaltest.gpkg_dr is None: pytest.skip() filename = '/vsimem/float32.gpkg' gdal.Translate(filename, 'data/float32.tif', format='GPKG', creationOptions=['RASTER_TABLE=foo']) ds = ogr.Open(filename, update=1) ds.ExecuteSQL('DROP TABLE foo') ds.ExecuteSQL('VACUUM') ds = None # Check that there is no more any reference to the layer f = gdal.VSIFOpenL(filename, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert 'foo' not in content gdal.Unlink(filename) ############################################################################### def test_gpkg_open_old_gpkg_elevation_tiles_extension(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.ErrorReset() ds = gdal.Open('data/gpkg/uint16-old-elevation-extension.gpkg') assert gdal.GetLastErrorMsg() == '' cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 ############################################################################### def test_gpkg_GeneralCmdLineProcessor(): if gdaltest.gpkg_dr is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_gdalinfo_path() is not None and test_cli_utilities.get_ogrinfo_path() is not None: ret_gdalinfo = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --format GPKG') ret_ogrinfo = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' --format GPKG') assert ('' in ret_gdalinfo and \ '' in ret_ogrinfo and \ 'scope=' not in ret_gdalinfo and \ 'scope=' not in ret_ogrinfo) ############################################################################### def test_gpkg_match_overview_factor(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/gpkg_match_overview_factor.gpkg', open('data/gpkg/test_match_overview_factor.gpkg', 'rb').read()) ds = gdal.Open('/vsimem/gpkg_match_overview_factor.gpkg', gdal.GA_Update) ret = ds.BuildOverviews('NONE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]) assert ret == 0 and gdal.GetLastErrorMsg() == '' ds = None gdal.Unlink('/vsimem/gpkg_match_overview_factor.gpkg') ############################################################################### def test_gpkg_wkt2(): if gdaltest.gpkg_dr is None: pytest.skip() # WKT2-only compatible SRS with EPSG code filename = '/vsimem/test_gpkg_wkt2.gpkg' ds = gdaltest.gpkg_dr.Create(filename, 1, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(4979) # WGS 84 3D sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ds.SetSpatialRef(sr) ds.SetGeoTransform([2,1,0,49,0,-1]) ds = None ds = gdal.Open(filename) sr_got = ds.GetSpatialRef() assert sr_got.IsSame(sr), sr_got.ExportToWkt() lyr = ds.ExecuteSQL('SELECT * FROM gpkg_spatial_ref_sys ORDER BY srs_id') f = lyr.GetNextFeature() assert f.GetField('srs_name') == 'Undefined cartesian SRS' assert f.GetField('srs_id') == -1 assert f.GetField('organization') == 'NONE' assert f.GetField('organization_coordsys_id') == -1 assert f.GetField('definition') == 'undefined' assert f.GetField('description') == 'undefined cartesian coordinate reference system' assert f.GetField('definition_12_063') == 'undefined' lyr.GetNextFeature() f = lyr.GetNextFeature() assert f.GetField('definition').startswith('GEOGCS["WGS 84"') assert f.GetField('definition_12_063').startswith('GEODCRS["WGS 84"') and 'ID["EPSG",4326]' in f.GetField('definition_12_063') f = lyr.GetNextFeature() assert f.GetField('definition') == 'undefined' assert f.GetField('definition_12_063').startswith('GEODCRS["WGS 84"') and 'ID["EPSG",4979]' in f.GetField('definition_12_063') ds.ReleaseResultSet(lyr) lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE extension_name = 'gpkg_crs_wkt'") assert lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(lyr) ds = None # WKT2-only compatible SRS without EPSG code ds = gdaltest.gpkg_dr.Create(filename, 1, 1, options = ['APPEND_SUBDATASET=YES', 'RASTER_TABLE=table2']) sr.SetFromUserInput('GEODCRS["my CRS",DATUM["my datum",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]]]') sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ds.SetSpatialRef(sr) ds.SetGeoTransform([2,1,0,49,0,-1]) ds = None ds = gdal.Open('GPKG:' + filename + ':table2') sr_got = ds.GetSpatialRef() assert sr_got.IsSame(sr), sr_got.ExportToWkt() ds = None # WKT1 compatible SRS ds = gdaltest.gpkg_dr.Create(filename, 1, 1, options = ['APPEND_SUBDATASET=YES', 'RASTER_TABLE=table3']) sr.ImportFromEPSG(32631) sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ds.SetSpatialRef(sr) ds.SetGeoTransform([500000,1,0,4500000,0,-1]) ds = None ds = gdal.Open('GPKG:' + filename + ':table3') sr_got = ds.GetSpatialRef() assert sr_got.IsSame(sr), sr_got.ExportToWkt() lyr = ds.ExecuteSQL('SELECT * FROM gpkg_spatial_ref_sys WHERE srs_id = 32631') f = lyr.GetNextFeature() assert f.GetField('definition').startswith('PROJCS["WGS 84 / UTM zone 31N",') and 'AUTHORITY["EPSG","32631"]' in f.GetField('definition') assert f.GetField('definition_12_063').startswith('PROJCRS["WGS 84 / UTM zone 31N",') and 'ID["EPSG",32631]' in f.GetField('definition_12_063') ds.ReleaseResultSet(lyr) ds = None assert validate(filename), 'validation failed' gdal.Unlink(filename) ############################################################################### # Test reading a 50000x25000 block uint16 def test_gpkg_50000_25000_uint16(): if gdaltest.gpkg_dr is None: pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() if sys.maxsize < 2**32: pytest.skip('Test not available on 32 bit') ds = gdal.Open('/vsizip/data/gpkg/50000_25000_uint16.gpkg.zip/50000_25000_uint16.gpkg') import psutil sizeof_uint16 = 2 sizeof_block = 50000 * 25000 * sizeof_uint16 # 2 * sizeof_block, because of GDAL block cache and GPKG internal cache if psutil.virtual_memory().available < 2 * sizeof_block: pytest.skip("Not enough virtual memory available") data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) assert data ref_ds = gdal.Open('../gcore/data/uint16.tif') assert data == ref_ds.ReadRaster() ############################################################################### # Test reading a 50000x50000 block uint16 def test_gpkg_50000_50000_uint16(): if gdaltest.gpkg_dr is None: pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() if sys.maxsize < 2**32: pytest.skip('Test not available on 32 bit') ds = gdal.Open('/vsizip/data/gpkg/50000_50000_uint16.gpkg.zip/50000_50000_uint16.gpkg') import psutil sizeof_uint16 = 2 sizeof_block = 50000 * 50000 * sizeof_uint16 # 2 * sizeof_block, because of GDAL block cache and GPKG internal cache if psutil.virtual_memory().available < 2 * sizeof_block: pytest.skip("Not enough virtual memory available") data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) assert data ref_ds = gdal.Open('../gcore/data/uint16.tif') assert data == ref_ds.ReadRaster() ############################################################################### # Test writing PNG tiles with negative values def test_gpkg_float32_png_negative_values(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.png_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') ds = gdaltest.gpkg_dr.Create('/vsimem/tmp.gpkg', 1, 1, 1, gdal.GDT_Float32, options=['TILE_FORMAT=PNG']) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds.GetRasterBand(1).SetNoDataValue(-32768) ds.GetRasterBand(1).Fill(-10) ds = None ds = gdal.Open('/vsimem/tmp.gpkg') assert ds.GetRasterBand(1).ComputeRasterMinMax() == (-10, -10) ds = None gdal.Unlink('/vsimem/tmp.gpkg') ############################################################################### # def test_gpkg_cleanup(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.Unlink('/vsimem/tmp.gpkg') gdal.Unlink('/vsimem/tmp.gpkg.aux.xml') gdal.SetConfigOption('GPKG_DEBUG', None) ############################################################################### gdalautotest-3.2.2/gdrivers/netcdf.py0000775000175000017500000051640314020414370016345 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: netcdf.py 7bfecfa72d986a33e07ea3110f2e5d38803a167a 2020-11-23 17:07:35 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test NetCDF driver support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # Copyright (c) 2008-2016, Even Rouault # Copyright (c) 2010, Kyle Shannon # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import sys import shutil import struct from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest import gdaltest import test_cli_utilities from uffd import uffd_compare ############################################################################### # Netcdf Functions ############################################################################### ############################################################################### # Get netcdf version and test for supported files @pytest.fixture(autouse=True, scope='module') def netcdf_setup(): # NOTE: this is also used by netcdf_cf.py gdaltest.netcdf_drv_version = 'unknown' gdaltest.netcdf_drv_has_nc2 = False gdaltest.netcdf_drv_has_nc4 = False gdaltest.netcdf_drv_has_hdf4 = False gdaltest.netcdf_drv_silent = False gdaltest.netcdf_drv = gdal.GetDriverByName('NETCDF') if gdaltest.netcdf_drv is None: pytest.skip('NOTICE: netcdf not supported, skipping checks') # get capabilities from driver metadata = gdaltest.netcdf_drv.GetMetadata() if metadata is None: pytest.skip('NOTICE: netcdf metadata not found, skipping checks') # netcdf library version "3.6.3" of Dec 22 2009 06:10:17 $ # netcdf library version 4.1.1 of Mar 4 2011 12:52:19 $ if 'NETCDF_VERSION' in metadata: v = metadata['NETCDF_VERSION'] v = v[0: v.find(' ')].strip('"') gdaltest.netcdf_drv_version = v if 'NETCDF_HAS_NC2' in metadata \ and metadata['NETCDF_HAS_NC2'] == 'YES': gdaltest.netcdf_drv_has_nc2 = True if 'NETCDF_HAS_NC4' in metadata \ and metadata['NETCDF_HAS_NC4'] == 'YES': gdaltest.netcdf_drv_has_nc4 = True if 'NETCDF_HAS_HDF4' in metadata \ and metadata['NETCDF_HAS_HDF4'] == 'YES': gdaltest.netcdf_drv_has_hdf4 = True print('NOTICE: using netcdf version ' + gdaltest.netcdf_drv_version + ' has_nc2: ' + str(gdaltest.netcdf_drv_has_nc2) + ' has_nc4: ' + str(gdaltest.netcdf_drv_has_nc4)) gdaltest.count_opened_files = len(gdaltest.get_opened_files()) @pytest.fixture(autouse=True, scope='module') def netcdf_teardown(): diff = len(gdaltest.get_opened_files()) - gdaltest.count_opened_files assert diff == 0, 'Leak of file handles: %d leaked' % diff ############################################################################### # test file copy # helper function needed so we can call Process() on it from netcdf_test_copy_timeout() def netcdf_test_copy(ifile, band, checksum, ofile, opts=None, driver='NETCDF'): # pylint: disable=unused-argument opts = [] if opts is None else opts test = gdaltest.GDALTest('NETCDF', '../' + ifile, band, checksum, options=opts) return test.testCreateCopy(check_gt=0, check_srs=0, new_filename=ofile, delete_copy=0, check_minmax=0) ############################################################################### # test file copy, optional timeout arg def netcdf_test_copy_timeout(ifile, band, checksum, ofile, opts=None, driver='NETCDF', timeout=None): from multiprocessing import Process drv = gdal.GetDriverByName(driver) if os.path.exists(ofile): drv.Delete(ofile) if timeout is None: netcdf_test_copy(ifile, band, checksum, ofile, opts, driver) else: sys.stdout.write('.') sys.stdout.flush() proc = Process(target=netcdf_test_copy, args=(ifile, band, checksum, ofile, opts)) proc.start() proc.join(timeout) # if proc is alive after timeout we must terminate it, and return fail # valgrind detects memory leaks when this occurs (although it should never happen) if proc.is_alive(): proc.terminate() if os.path.exists(ofile): drv.Delete(ofile) print('testCreateCopy() for file %s has reached timeout limit of %d seconds' % (ofile, timeout)) pytest.fail() ############################################################################### # check support for DEFLATE compression, requires HDF5 and zlib def netcdf_test_deflate(ifile, checksum, zlevel=1, timeout=None): try: from multiprocessing import Process Process.is_alive except (ImportError, AttributeError): pytest.skip('from multiprocessing import Process failed') if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ofile1 = 'tmp/' + os.path.basename(ifile) + '-1.nc' ofile1_opts = ['FORMAT=NC4C', 'COMPRESS=NONE'] ofile2 = 'tmp/' + os.path.basename(ifile) + '-2.nc' ofile2_opts = ['FORMAT=NC4C', 'COMPRESS=DEFLATE', 'ZLEVEL=' + str(zlevel)] assert os.path.exists(ifile), ('ifile %s does not exist' % ifile) netcdf_test_copy_timeout(ifile, 1, checksum, ofile1, ofile1_opts, 'NETCDF', timeout) netcdf_test_copy_timeout(ifile, 1, checksum, ofile2, ofile2_opts, 'NETCDF', timeout) # make sure compressed file is smaller than uncompressed files try: size1 = os.path.getsize(ofile1) size2 = os.path.getsize(ofile2) except OSError: pytest.fail('Error getting file sizes.') assert size2 < size1, \ 'Compressed file is not smaller than reference, check your netcdf-4, HDF5 and zlib installation' ############################################################################### # check support for reading attributes (single values and array values) def netcdf_check_vars(ifile, vals_global=None, vals_band=None): src_ds = gdal.Open(ifile) assert src_ds is not None, ('could not open dataset ' + ifile) metadata_global = src_ds.GetMetadata() assert metadata_global is not None, ('could not get global metadata from ' + ifile) missval = src_ds.GetRasterBand(1).GetNoDataValue() assert missval == 1, ('got invalid nodata value %s for Band' % str(missval)) metadata_band = src_ds.GetRasterBand(1).GetMetadata() assert metadata_band is not None, 'could not get Band metadata' metadata = metadata_global vals = vals_global if vals is None: vals = dict() for k, v in vals.items(): assert k in metadata, ("missing metadata [%s]" % (str(k))) # strip { and } as new driver uses these for array values mk = metadata[k].lstrip('{ ').rstrip('} ') assert mk == v, ("invalid value [%s] for metadata [%s]=[%s]" % (str(mk), str(k), str(v))) metadata = metadata_band vals = vals_band if vals is None: vals = dict() for k, v in vals.items(): assert k in metadata, ("missing metadata [%s]" % (str(k))) # strip { and } as new driver uses these for array values mk = metadata[k].lstrip('{ ').rstrip('} ') assert mk == v, ("invalid value [%s] for metadata [%s]=[%s]" % (str(mk), str(k), str(v))) ############################################################################### # Netcdf Tests ############################################################################### ############################################################################### # Perform simple read test. def test_netcdf_1(): if gdaltest.netcdf_drv is None: pytest.skip() tst = gdaltest.GDALTest('NetCDF', 'NETCDF:"data/netcdf/bug636.nc":tas', 1, 31621, filename_absolute=1) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. gdal.PushErrorHandler('CPLQuietErrorHandler') tst.testOpen() gdal.PopErrorHandler() ############################################################################### # Verify a simple createcopy operation. We can't do the trivial gdaltest # operation because the new file will only be accessible via subdatasets. def test_netcdf_2(): if gdaltest.netcdf_drv is None: pytest.skip() src_ds = gdal.Open('data/byte.tif') gdaltest.netcdf_drv.CreateCopy('tmp/netcdf2.nc', src_ds) tst = gdaltest.GDALTest('NetCDF', 'tmp/netcdf2.nc', 1, 4672, filename_absolute=1) wkt = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982139006, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26711"]]""" tst.testOpen(check_prj=wkt) # Check that no nodata value is reported for a Byte dataset ds = gdal.Open('tmp/netcdf2.nc') assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None # Test that in raster-only mode, update isn't supported (not sure what would be missing for that...) with gdaltest.error_handler(): ds = gdal.Open('tmp/netcdf2.nc', gdal.GA_Update) assert ds is None gdaltest.clean_tmp() ############################################################################### def test_netcdf_3(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/sombrero.grd') bnd = ds.GetRasterBand(1) minmax = bnd.ComputeRasterMinMax() assert minmax[0] == pytest.approx((-0.675758), abs=0.000001) and minmax[1] == pytest.approx(1.0, abs=0.000001), \ 'Wrong min or max.' bnd = None ds = None ############################################################################### # In #2582 5dimensional files were causing problems. Verify use ok. def test_netcdf_4(): if gdaltest.netcdf_drv is None: pytest.skip() tst = gdaltest.GDALTest('NetCDF', 'NETCDF:data/netcdf/foo_5dimensional.nc:temperature', 3, 1218, filename_absolute=1) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. gdal.PushErrorHandler('CPLQuietErrorHandler') # don't test for checksum (see bug #4284) result = tst.testOpen(skip_checksum=True) gdal.PopErrorHandler() return result ############################################################################### # In #2583 5dimensional files were having problems unrolling the highest # dimension - check handling now on band 7. def test_netcdf_5(): if gdaltest.netcdf_drv is None: pytest.skip() tst = gdaltest.GDALTest('NetCDF', 'NETCDF:data/netcdf/foo_5dimensional.nc:temperature', 7, 1227, filename_absolute=1) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. gdal.PushErrorHandler('CPLQuietErrorHandler') # don't test for checksum (see bug #4284) result = tst.testOpen(skip_checksum=True) gdal.PopErrorHandler() return result ############################################################################### # ticket #3324 check spatial reference reading for cf-1.4 lambert conformal # 1 standard parallel. def test_netcdf_6(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/cf_lcc1sp.nc') prj = ds.GetProjection() sr = osr.SpatialReference() sr.ImportFromWkt(prj) lat_origin = sr.GetProjParm('latitude_of_origin') assert lat_origin == 25, ('Latitude of origin does not match expected:\n%f' % lat_origin) ds = None ############################################################################### # ticket #3324 check spatial reference reading for cf-1.4 lambert conformal # 2 standard parallels. def test_netcdf_7(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/cf_lcc2sp.nc') prj = ds.GetProjection() sr = osr.SpatialReference() sr.ImportFromWkt(prj) std_p1 = sr.GetProjParm('standard_parallel_1') std_p2 = sr.GetProjParm('standard_parallel_2') assert std_p1 == 33.0 and std_p2 == 45.0, \ ('Standard Parallels do not match expected:\n%f,%f' % (std_p1, std_p2)) ds = None sr = None ############################################################################### # check for cf convention read of albers equal area # Previous version compared entire wkt, which varies slightly among driver versions # now just look for PROJECTION=Albers_Conic_Equal_Area and some parameters def test_netcdf_8(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/cf_aea2sp_invf.nc') srs = osr.SpatialReference() srs.ImportFromWkt(ds.GetProjection()) proj = srs.GetAttrValue('PROJECTION') assert proj == 'Albers_Conic_Equal_Area', \ ('Projection does not match expected : ' + proj) param = srs.GetProjParm('latitude_of_center') assert param == 37.5, ('Got wrong parameter value (%g)' % param) param = srs.GetProjParm('longitude_of_center') assert param == -96, ('Got wrong parameter value (%g)' % param) ds = None ############################################################################### # check to see if projected systems default to wgs84 if no spheroid def def test_netcdf_9(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/cf_no_sphere.nc') prj = ds.GetProjection() sr = osr.SpatialReference() sr.ImportFromWkt(prj) spheroid = sr.GetAttrValue('SPHEROID') assert spheroid == 'WGS 84', ('Incorrect spheroid read from file\n%s' % (spheroid)) ds = None sr = None ############################################################################### # check if km pixel size makes it through to gt def test_netcdf_10(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/cf_no_sphere.nc') prj = ds.GetProjection() gt = ds.GetGeoTransform() gt1 = (-1897186.0290038721, 5079.3608398440065, 0.0, 2674684.0244560046, 0.0, -5079.4721679684635) gt2 = (-1897.186029003872, 5.079360839844003, 0.0, 2674.6840244560044, 0.0, -5.079472167968456) if gt != gt1: sr = osr.SpatialReference() sr.ImportFromWkt(prj) # new driver uses UNIT vattribute instead of scaling values assert (sr.GetAttrValue("PROJCS|UNIT", 1) == "1000" and gt == gt2), \ ('Incorrect geotransform, got ' + str(gt)) ds = None ############################################################################### # check if ll gets caught in km pixel size check def test_netcdf_11(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/cf_geog.nc') gt = ds.GetGeoTransform() assert gt == (-0.5, 1.0, 0.0, 10.5, 0.0, -1.0), 'Incorrect geotransform' ds = None ############################################################################### # check for scale/offset set/get. def test_netcdf_12(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/scale_offset.nc') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 0.01 and offset == 1.5 gdaltest.netcdf_drv.CreateCopy('tmp/tmp.nc', ds) ds = None ds = gdal.Open('tmp/tmp.nc') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 0.01 and offset == 1.5 ds = None gdaltest.netcdf_drv.Delete('tmp/tmp.nc') ############################################################################### # check for scale/offset = None if no scale or offset is available def test_netcdf_13(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/no_scale_offset.nc') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale is None and offset is None, 'Incorrect scale or offset' ds = None ############################################################################### # check for scale/offset for two variables def test_netcdf_14(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('NETCDF:data/netcdf/two_vars_scale_offset.nc:z') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 0.01 and offset == 1.5, \ ('Incorrect scale(%f) or offset(%f)' % (scale, offset)) ds = None ds = gdal.Open('NETCDF:data/netcdf/two_vars_scale_offset.nc:q') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 0.1 and offset == 2.5, \ ('Incorrect scale(%f) or offset(%f)' % (scale, offset)) ############################################################################### # check support for netcdf-2 (64 bit) # This test fails in 1.8.1, because the driver does not support NC2 (bug #3890) def test_netcdf_15(): if gdaltest.netcdf_drv is None: pytest.skip() if gdaltest.netcdf_drv_has_nc2: ds = gdal.Open('data/netcdf/trmm-nc2.nc') assert ds is not None ds = None return else: pytest.skip() ############################################################################### # check support for netcdf-4 def test_netcdf_16(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/trmm-nc4.nc' if gdaltest.netcdf_drv_has_nc4: # test with Open() ds = gdal.Open(ifile) if ds is None: pytest.fail('GDAL did not open file') else: name = ds.GetDriver().GetDescription() ds = None # return fail if did not open with the netCDF driver (i.e. HDF5Image) assert name == 'netCDF', 'netcdf driver did not open file' # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() assert name == 'netCDF', 'netcdf driver did not identify file' else: pytest.skip() ############################################################################### # check support for netcdf-4 - make sure hdf5 is not read by netcdf driver def test_netcdf_17(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/hdf5/groups.h5' # skip test if Hdf5 is not enabled if gdal.GetDriverByName('HDF5') is None and \ gdal.GetDriverByName('HDF5Image') is None: pytest.skip() if gdaltest.netcdf_drv_has_nc4: # test with Open() ds = gdal.Open(ifile) if ds is None: pytest.fail('GDAL did not open hdf5 file') else: name = ds.GetDriver().GetDescription() ds = None # return fail if opened with the netCDF driver assert name != 'netCDF', 'netcdf driver opened hdf5 file' # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() assert name != 'netCDF', 'netcdf driver was identified for hdf5 file' else: pytest.skip() ############################################################################### # check support for netcdf-4 classic (NC4C) def test_netcdf_18(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/trmm-nc4c.nc' if gdaltest.netcdf_drv_has_nc4: # test with Open() ds = gdal.Open(ifile) if ds is None: pytest.fail() else: name = ds.GetDriver().GetDescription() ds = None # return fail if did not open with the netCDF driver (i.e. HDF5Image) assert name == 'netCDF' # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() assert name == 'netCDF' else: pytest.skip() ############################################################################### # check support for reading with DEFLATE compression, requires NC4 def test_netcdf_19(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() tst = gdaltest.GDALTest('NetCDF', 'data/netcdf/trmm-nc4z.nc', 1, 50235, filename_absolute=1) result = tst.testOpen(skip_checksum=True) return result ############################################################################### # check support for writing with DEFLATE compression, requires NC4 def test_netcdf_20(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() # simple test with tiny file return netcdf_test_deflate('data/utm.tif', 50235) ############################################################################### # check support for writing large file with DEFLATE compression # if chunking is not defined properly within the netcdf driver, this test can take 1h def test_netcdf_21(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() bigfile = 'tmp/cache/utm-big.tif' sys.stdout.write('.') sys.stdout.flush() # create cache dir if absent if not os.path.exists('tmp/cache'): os.mkdir('tmp/cache') # look for large gtiff in cache if not os.path.exists(bigfile): # create large gtiff if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip('gdalwarp not found') warp_cmd = test_cli_utilities.get_gdalwarp_path() +\ ' -q -overwrite -r bilinear -ts 7680 7680 -of gtiff ' +\ 'data/utm.tif ' + bigfile try: (ret, err) = gdaltest.runexternal_out_and_err(warp_cmd) except OSError: pytest.fail('gdalwarp execution failed') assert not (err != '' or ret != ''), \ ('gdalwarp returned error\n' + str(ret) + ' ' + str(err)) # test compression of the file, with a conservative timeout of 60 seconds return netcdf_test_deflate(bigfile, 26695, 6, 60) ############################################################################### # check support for hdf4 def test_netcdf_22(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_hdf4: pytest.skip() ifile = 'data/hdf4/hdifftst2.hdf' # suppress warning gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('NETCDF:' + ifile) gdal.PopErrorHandler() if ds is None: pytest.fail('netcdf driver did not open hdf4 file') else: ds = None ############################################################################### # check support for hdf4 - make sure hdf4 file is not read by netcdf driver def test_netcdf_23(): # don't skip if netcdf is not enabled in GDAL # if gdaltest.netcdf_drv is None: # return 'skip' # if not gdaltest.netcdf_drv_has_hdf4: # return 'skip' # skip test if Hdf4 is not enabled in GDAL if gdal.GetDriverByName('HDF4') is None and \ gdal.GetDriverByName('HDF4Image') is None: pytest.skip() ifile = 'data/hdf4/hdifftst2.hdf' # test with Open() ds = gdal.Open(ifile) if ds is None: pytest.fail('GDAL did not open hdf4 file') else: name = ds.GetDriver().GetDescription() ds = None # return fail if opened with the netCDF driver assert name != 'netCDF', 'netcdf driver opened hdf4 file' # test with Identify() name = gdal.IdentifyDriver(ifile).GetDescription() assert name != 'netCDF', 'netcdf driver was identified for hdf4 file' ############################################################################### # check support for reading attributes (single values and array values) def test_netcdf_24(): if gdaltest.netcdf_drv is None: pytest.skip() vals_global = {'NC_GLOBAL#test': 'testval', 'NC_GLOBAL#valid_range_i': '0,255', 'NC_GLOBAL#valid_min': '10.1', 'NC_GLOBAL#test_b': '1'} vals_band = {'_Unsigned': 'true', 'valid_min': '10.1', 'valid_range_b': '1,10', 'valid_range_d': '0.1111112222222,255.555555555556', 'valid_range_f': '0.1111111,255.5556', 'valid_range_s': '0,255'} return netcdf_check_vars('data/netcdf/nc_vars.nc', vals_global, vals_band) ############################################################################### # check support for NC4 reading attributes (single values and array values) def netcdf_24_nc4(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() vals_global = {'NC_GLOBAL#test': 'testval', 'NC_GLOBAL#test_string': 'testval_string', 'NC_GLOBAL#valid_range_i': '0,255', 'NC_GLOBAL#valid_min': '10.1', 'NC_GLOBAL#test_b': '-100', 'NC_GLOBAL#test_ub': '200', 'NC_GLOBAL#test_s': '-16000', 'NC_GLOBAL#test_us': '32000', 'NC_GLOBAL#test_l': '-2000000000', 'NC_GLOBAL#test_ul': '4000000000'} vals_band = {'test_string_arr': 'test,string,arr', 'valid_min': '10.1', 'valid_range_b': '1,10', 'valid_range_ub': '1,200', 'valid_range_s': '0,255', 'valid_range_us': '0,32000', 'valid_range_l': '0,255', 'valid_range_ul': '0,4000000000', 'valid_range_d': '0.1111112222222,255.555555555556', 'valid_range_f': '0.1111111,255.5556'} return netcdf_check_vars('data/netcdf/nc4_vars.nc', vals_global, vals_band) ############################################################################### # check support for writing attributes (single values and array values) def test_netcdf_25(): if gdaltest.netcdf_drv is None: pytest.skip() netcdf_test_copy('data/netcdf/nc_vars.nc', 1, None, 'tmp/netcdf_25.nc') vals_global = {'NC_GLOBAL#test': 'testval', 'NC_GLOBAL#valid_range_i': '0,255', 'NC_GLOBAL#valid_min': '10.1', 'NC_GLOBAL#test_b': '1'} vals_band = {'_Unsigned': 'true', 'valid_min': '10.1', 'valid_range_b': '1,10', 'valid_range_d': '0.1111112222222,255.555555555556', 'valid_range_f': '0.1111111,255.5556', 'valid_range_s': '0,255'} return netcdf_check_vars('tmp/netcdf_25.nc', vals_global, vals_band) ############################################################################### # check support for NC4 writing attributes (single values and array values) def netcdf_25_nc4(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() netcdf_test_copy('data/netcdf/nc4_vars.nc', 1, None, 'tmp/netcdf_25_nc4.nc', ['FORMAT=NC4']) vals_global = {'NC_GLOBAL#test': 'testval', 'NC_GLOBAL#test_string': 'testval_string', 'NC_GLOBAL#valid_range_i': '0,255', 'NC_GLOBAL#valid_min': '10.1', 'NC_GLOBAL#test_b': '-100', 'NC_GLOBAL#test_ub': '200', 'NC_GLOBAL#test_s': '-16000', 'NC_GLOBAL#test_us': '32000', 'NC_GLOBAL#test_l': '-2000000000', 'NC_GLOBAL#test_ul': '4000000000'} vals_band = {'test_string_arr': 'test,string,arr', 'valid_min': '10.1', 'valid_range_b': '1,10', 'valid_range_ub': '1,200', 'valid_range_us': '0,32000', 'valid_range_l': '0,255', 'valid_range_ul': '0,4000000000', 'valid_range_d': '0.1111112222222,255.555555555556', 'valid_range_f': '0.1111111,255.5556', 'valid_range_s': '0,255'} return netcdf_check_vars('tmp/netcdf_25_nc4.nc', vals_global, vals_band) ############################################################################### # check support for WRITE_BOTTOMUP file creation option # use a dummy file with no lon/lat info to force a different checksum # depending on y-axis order def test_netcdf_26(): if gdaltest.netcdf_drv is None: pytest.skip() # test default config test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4672) gdal.PushErrorHandler('CPLQuietErrorHandler') test.testCreateCopy(check_gt=0, check_srs=0, check_minmax=0) gdal.PopErrorHandler() # test WRITE_BOTTOMUP=NO test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4855, options=['WRITE_BOTTOMUP=NO']) test.testCreateCopy(check_gt=0, check_srs=0, check_minmax=0) ############################################################################### # check support for GDAL_NETCDF_BOTTOMUP configuration option def test_netcdf_27(): if gdaltest.netcdf_drv is None: pytest.skip() # test default config test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4672) config_bak = gdal.GetConfigOption('GDAL_NETCDF_BOTTOMUP') gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', None) test.testOpen() gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', config_bak) # test GDAL_NETCDF_BOTTOMUP=NO test = gdaltest.GDALTest('NETCDF', 'netcdf/int16-nogeo.nc', 1, 4855) config_bak = gdal.GetConfigOption('GDAL_NETCDF_BOTTOMUP') gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', 'NO') test.testOpen() gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', config_bak) ############################################################################### # check support for writing multi-dimensional files (helper function) def netcdf_test_4dfile(ofile): # test result file has 8 bands and 0 subdasets (instead of 0 bands and 8 subdatasets) ds = gdal.Open(ofile) assert ds is not None, 'open of copy failed' md = ds.GetMetadata('SUBDATASETS') subds_count = 0 if md is not None: subds_count = len(md) / 2 assert ds.RasterCount == 8 and subds_count == 0, \ ('copy has %d bands (expected 8) and has %d subdatasets' ' (expected 0)' % (ds.RasterCount, subds_count)) ds = None # get file header with ncdump (if available) try: (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') except OSError: print('NOTICE: ncdump not found') return if err is None or 'netcdf library version' not in err: print('NOTICE: ncdump not found') return (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h ' + ofile) assert ret != '' and err == '', 'ncdump failed' # simple dimension tests using ncdump output err = "" if 'int t(time, levelist, lat, lon) ;' not in ret: err = err + 'variable (t) has wrong dimensions or is missing\n' if 'levelist = 2 ;' not in ret: err = err + 'levelist dimension is missing or incorrect\n' if 'int levelist(levelist) ;' not in ret: err = err + 'levelist variable is missing or incorrect\n' if 'time = 4 ;' not in ret: err = err + 'time dimension is missing or incorrect\n' if 'double time(time) ;' not in ret: err = err + 'time variable is missing or incorrect\n' # uncomment this to get full header in output # if err != '': # err = err + ret assert err == '' ############################################################################### # check support for writing multi-dimensional files using CreateCopy() def test_netcdf_28(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/netcdf-4d.nc' ofile = 'tmp/netcdf_28.nc' # copy file netcdf_test_copy(ifile, 0, None, ofile) # test file return netcdf_test_4dfile(ofile) ############################################################################### # Check support for writing multi-dimensional files using gdalwarp. # Requires metadata copy support in gdalwarp (see bug #3898). # First create a vrt file using gdalwarp, then copy file to netcdf. # The workaround is (currently ??) necessary because dimension rolling code is # in netCDFDataset::CreateCopy() and necessary dimension metadata # is not saved to netcdf when using gdalwarp (as the driver does not write # metadata to netcdf file with SetMetadata() and SetMetadataItem()). def test_netcdf_29(): if gdaltest.netcdf_drv is None: pytest.skip() # create tif file using gdalwarp if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip('gdalwarp not found') ifile = 'data/netcdf/netcdf-4d.nc' ofile1 = 'tmp/netcdf_29.vrt' ofile = 'tmp/netcdf_29.nc' warp_cmd = '%s -q -overwrite -of vrt %s %s' %\ (test_cli_utilities.get_gdalwarp_path(), ifile, ofile1) try: (ret, err) = gdaltest.runexternal_out_and_err(warp_cmd) except OSError: pytest.fail('gdalwarp execution failed') assert not (err != '' or ret != ''), \ ('gdalwarp returned error\n' + str(ret) + ' ' + str(err)) # copy vrt to netcdf, with proper dimension rolling netcdf_test_copy(ofile1, 0, None, ofile) # test file netcdf_test_4dfile(ofile) ############################################################################### # check support for file with nan values (bug #4705) def test_netcdf_30(): if gdaltest.netcdf_drv is None: pytest.skip() tst = gdaltest.GDALTest('NetCDF', 'netcdf/trmm-nan.nc', 1, 62519) # We don't want to gum up the test stream output with the # 'Warning 1: No UNIDATA NC_GLOBAL:Conventions attribute' message. gdal.PushErrorHandler('CPLQuietErrorHandler') result = tst.testOpen() gdal.PopErrorHandler() return result ############################################################################### # check if 2x2 file has proper geotransform # 1 pixel (in width or height) still unsupported because we can't get the pixel dimensions def test_netcdf_31(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/trmm-2x2.nc') ds.GetProjection() gt = ds.GetGeoTransform() gt1 = (-80.0, 0.25, 0.0, -19.5, 0.0, -0.25) assert gt == gt1, ('Incorrect geotransform, got ' + str(gt)) ds = None ############################################################################### # Test NC_UBYTE write/read - netcdf-4 (FORMAT=NC4) only (#5053) def test_netcdf_32(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ifile = 'data/byte.tif' ofile = 'tmp/netcdf_32.nc' # gdal.SetConfigOption('CPL_DEBUG', 'ON') # test basic read/write netcdf_test_copy(ifile, 1, 4672, ofile, ['FORMAT=NC4']) netcdf_test_copy(ifile, 1, 4672, ofile, ['FORMAT=NC4C']) ############################################################################### # TEST NC_UBYTE metadata read - netcdf-4 (FORMAT=NC4) only (#5053) def test_netcdf_33(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/nc_vars.nc' ofile = 'tmp/netcdf_33.nc' netcdf_test_copy(ifile, 1, None, ofile, ['FORMAT=NC4']) return netcdf_check_vars('tmp/netcdf_33.nc') ############################################################################### # check support for reading large file with chunking and DEFLATE compression # if chunking is not supported within the netcdf driver, this test can take very long def test_netcdf_34(): filename = 'utm-big-chunks.nc' # this timeout is more than enough - on my system takes <1s with fix, about 25 seconds without timeout = 5 if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() try: from multiprocessing import Process except ImportError: pytest.skip('from multiprocessing import Process failed') if not gdaltest.download_file('http://download.osgeo.org/gdal/data/netcdf/' + filename, filename): pytest.skip() sys.stdout.write('.') sys.stdout.flush() tst = gdaltest.GDALTest('NetCDF', '../tmp/cache/' + filename, 1, 31621) # tst.testOpen() gdal.PushErrorHandler('CPLQuietErrorHandler') proc = Process(target=tst.testOpen) proc.start() proc.join(timeout) gdal.PopErrorHandler() # if proc is alive after timeout we must terminate it, and return fail # valgrind detects memory leaks when this occurs (although it should never happen) if proc.is_alive(): proc.terminate() pytest.fail('testOpen() for file %s has reached timeout limit of %d seconds' % (filename, timeout)) ############################################################################### # test writing a long metadata > 8196 chars (bug #5113) def test_netcdf_35(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/netcdf_fixes.nc' ofile = 'tmp/netcdf_35.nc' # copy file netcdf_test_copy(ifile, 0, None, ofile) # test long metadata is copied correctly ds = gdal.Open(ofile) assert ds is not None, 'open of copy failed' md = ds.GetMetadata('') assert 'U#bla' in md, 'U#bla metadata absent' bla = md['U#bla'] assert len(bla) == 9591, \ ('U#bla metadata is of length %d, expecting %d' % (len(bla), 9591)) assert bla[-4:] == '_bla', \ ('U#bla metadata ends with [%s], expecting [%s]' % (bla[-4:], '_bla')) ############################################################################### # test for correct geotransform (bug #5114) def test_netcdf_36(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/netcdf_fixes.nc' ds = gdal.Open(ifile) assert ds is not None, 'open failed' gt = ds.GetGeoTransform() assert gt is not None, 'got no GeoTransform' gt_expected = (-3.498749944898817, 0.0025000042385525173, 0.0, 46.61749818589952, 0.0, -0.001666598849826389) assert gt == gt_expected, \ ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) ############################################################################### # test for correct geotransform with longitude wrap def test_netcdf_36_lonwrap(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/nc_lonwrap.nc' ds = gdal.Open(ifile) assert ds is not None, 'open failed' gt = ds.GetGeoTransform() assert gt is not None, 'got no GeoTransform' gt_expected = (-2.25, 2.5, 0.0, 16.25, 0.0, -2.5) assert gt == gt_expected, \ ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) ############################################################################### # test for reading gaussian grid (bugs #4513 and #5118) def test_netcdf_37(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/reduce-cgcms.nc' gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open(ifile) gdal.PopErrorHandler() assert ds is not None, 'open failed' gt = ds.GetGeoTransform() assert gt is not None, 'got no GeoTransform' gt_expected = (-1.875, 3.75, 0.0, 89.01354337620016, 0.0, -3.7088976406750063) assert gt == gt_expected, \ ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) md = ds.GetMetadata('GEOLOCATION2') assert md and 'Y_VALUES' in md, 'did not get 1D geolocation' y_vals = md['Y_VALUES'] assert y_vals.startswith('{-87.15909455586265,-83.47893666931698,') and y_vals.endswith(',83.47893666931698,87.15909455586265}'), \ 'got incorrect values in 1D geolocation' ############################################################################### # test for correct geotransform of projected data in km units (bug #5118) def test_netcdf_38(): if gdaltest.netcdf_drv is None: pytest.skip() ifile = 'data/netcdf/bug5118.nc' gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open(ifile) gdal.PopErrorHandler() assert ds is not None, 'open failed' gt = ds.GetGeoTransform() assert gt is not None, 'got no GeoTransform' gt_expected = (-1659.3478178136488, 13.545000861672793, 0.0, 2330.054725283668, 0.0, -13.54499744233631) assert gt == gt_expected, \ ('got GeoTransform %s, expected %s' % (str(gt), str(gt_expected))) ############################################################################### # Test VRT and NETCDF: def test_netcdf_39(): if gdaltest.netcdf_drv is None: pytest.skip() shutil.copy('data/netcdf/two_vars_scale_offset.nc', 'tmp') src_ds = gdal.Open('NETCDF:tmp/two_vars_scale_offset.nc:z') out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/netcdf_39.vrt', src_ds) out_ds = None src_ds = None ds = gdal.Open('tmp/netcdf_39.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('tmp/two_vars_scale_offset.nc') gdal.Unlink('tmp/netcdf_39.vrt') assert cs == 65463 shutil.copy('data/netcdf/two_vars_scale_offset.nc', 'tmp') src_ds = gdal.Open('NETCDF:"tmp/two_vars_scale_offset.nc":z') out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/netcdf_39.vrt', src_ds) out_ds = None src_ds = None ds = gdal.Open('tmp/netcdf_39.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('tmp/two_vars_scale_offset.nc') gdal.Unlink('tmp/netcdf_39.vrt') assert cs == 65463 shutil.copy('data/netcdf/two_vars_scale_offset.nc', 'tmp') src_ds = gdal.Open('NETCDF:"%s/tmp/two_vars_scale_offset.nc":z' % os.getcwd()) out_ds = gdal.GetDriverByName('VRT').CreateCopy('%s/tmp/netcdf_39.vrt' % os.getcwd(), src_ds) out_ds = None src_ds = None ds = gdal.Open('tmp/netcdf_39.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('tmp/two_vars_scale_offset.nc') gdal.Unlink('tmp/netcdf_39.vrt') assert cs == 65463 src_ds = gdal.Open('NETCDF:"%s/data/netcdf/two_vars_scale_offset.nc":z' % os.getcwd()) out_ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/netcdf_39.vrt', src_ds) del out_ds src_ds = None ds = gdal.Open('tmp/netcdf_39.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('tmp/netcdf_39.vrt') assert cs == 65463 ############################################################################### # Check support of reading of chunked bottom-up files. def test_netcdf_40(): if gdaltest.netcdf_drv is None or not gdaltest.netcdf_drv_has_nc4: pytest.skip() return netcdf_test_copy('data/netcdf/bug5291.nc', 0, None, 'tmp/netcdf_40.nc') ############################################################################### # Test support for georeferenced file without CF convention def test_netcdf_41(): if gdaltest.netcdf_drv is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/netcdf/byte_no_cf.nc') assert ds.GetGeoTransform() == (440720, 60, 0, 3751320, 0, -60) assert ds.GetProjectionRef().find('26711') >= 0, ds.GetGeoTransform() ############################################################################### # Test writing & reading GEOLOCATION array def test_netcdf_42(): if gdaltest.netcdf_drv is None: pytest.skip() src_ds = gdal.GetDriverByName('MEM').Create('', 60, 39, 1) src_ds.SetMetadata([ 'LINE_OFFSET=0', 'LINE_STEP=1', 'PIXEL_OFFSET=0', 'PIXEL_STEP=1', 'SRS=GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4326"]]', 'X_BAND=1', 'X_DATASET=../gcore/data/sstgeo.tif', 'Y_BAND=2', 'Y_DATASET=../gcore/data/sstgeo.tif'], 'GEOLOCATION') sr = osr.SpatialReference() sr.ImportFromEPSG(32631) src_ds.SetProjection(sr.ExportToWkt()) gdaltest.netcdf_drv.CreateCopy('tmp/netcdf_42.nc', src_ds) ds = gdal.Open('tmp/netcdf_42.nc') assert (ds.GetMetadata('GEOLOCATION') == { 'LINE_OFFSET': '0', 'X_DATASET': 'NETCDF:"tmp/netcdf_42.nc":lon', 'PIXEL_STEP': '1', 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', 'PIXEL_OFFSET': '0', 'X_BAND': '1', 'LINE_STEP': '1', 'Y_DATASET': 'NETCDF:"tmp/netcdf_42.nc":lat', 'Y_BAND': '1'}) ds = gdal.Open('NETCDF:"tmp/netcdf_42.nc":lon') assert ds.GetRasterBand(1).Checksum() == 36043 ds = gdal.Open('NETCDF:"tmp/netcdf_42.nc":lat') assert ds.GetRasterBand(1).Checksum() == 33501 ############################################################################### # Test reading GEOLOCATION array from geotransform (non default) def test_netcdf_43(): if gdaltest.netcdf_drv is None: pytest.skip() src_ds = gdal.Open('data/byte.tif') gdaltest.netcdf_drv.CreateCopy('tmp/netcdf_43.nc', src_ds, options=['WRITE_LONLAT=YES']) ds = gdal.Open('tmp/netcdf_43.nc') assert (ds.GetMetadata('GEOLOCATION') == { 'LINE_OFFSET': '0', 'X_DATASET': 'NETCDF:"tmp/netcdf_43.nc":lon', 'PIXEL_STEP': '1', 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', 'PIXEL_OFFSET': '0', 'X_BAND': '1', 'LINE_STEP': '1', 'Y_DATASET': 'NETCDF:"tmp/netcdf_43.nc":lat', 'Y_BAND': '1'}) tmp_ds = gdal.Warp('', 'tmp/netcdf_43.nc', options = '-f MEM -geoloc') gt = tmp_ds.GetGeoTransform() assert gt[0] == pytest.approx(-117.3, abs=1), gt assert gt[3] == pytest.approx(33.9, abs=1), gt ############################################################################### # Test NC_USHORT/UINT read/write - netcdf-4 only (#6337) def test_netcdf_44(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() for f, md5 in ('data/netcdf/ushort.nc', 18), ('data/netcdf/uint.nc', 10): netcdf_test_copy(f, 1, md5, 'tmp/netcdf_44.nc', ['FORMAT=NC4']) ############################################################################### # Test reading a vector NetCDF 3 file def test_netcdf_45(): if gdaltest.netcdf_drv is None: pytest.skip() # Test that a vector cannot be opened in raster-only mode ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_RASTER) assert ds is None # Test that a raster cannot be opened in vector-only mode ds = gdal.OpenEx('data/netcdf/cf-bug636.nc', gdal.OF_VECTOR) assert ds is None ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_VECTOR) with gdaltest.error_handler(): gdal.VectorTranslate('/vsimem/netcdf_45.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_45.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string1char,string3chars,twodimstringchar,date,datetime_explicit_fillValue,datetime,int64var,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,x,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,1234567890123,1,1,1.2,1.2,123,12,5,-125 "POINT (1 2)",,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,, """ assert content == expected_content fp = gdal.VSIFOpenL('/vsimem/netcdf_45.csvt', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(1),String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_45.csv') gdal.Unlink('/vsimem/netcdf_45.csvt') gdal.Unlink('/vsimem/netcdf_45.prj') ############################################################################### # Test reading a vector NetCDF 3 file def test_netcdf_46(): if gdaltest.netcdf_drv is None: pytest.skip() if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/netcdf/test_ogr_nc3.nc') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test reading a vector NetCDF 4 file def test_netcdf_47(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() # Test that a vector cannot be opened in raster-only mode with gdaltest.error_handler(): ds = gdal.OpenEx('data/netcdf/test_ogr_nc4.nc', gdal.OF_RASTER) assert ds is None ds = gdal.OpenEx('data/netcdf/test_ogr_nc4.nc', gdal.OF_VECTOR) with gdaltest.error_handler(): gdal.VectorTranslate('/vsimem/netcdf_47.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_47.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string3chars,twodimstringchar,date,datetime,datetime_explicit_fillValue,int64,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field,ubyte_field,ubyte_field_explicit_fillValue,ushort_field,ushort_field_explicit_fillValue,uint_field,uint_field_explicit_fillValue,uint64_field,uint64_field_explicit_fillValue "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,,1,1,1.2,1.2,123,12,5,-125,254,255,65534,65535,4000000000,4294967295,1234567890123, "POINT (1 2)",,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,, """ assert content == expected_content fp = gdal.VSIFOpenL('/vsimem/netcdf_47.csvt', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer,Integer,Integer,Integer,Integer,Integer64,Integer64,Real,Real """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_47.csv') gdal.Unlink('/vsimem/netcdf_47.csvt') gdal.Unlink('/vsimem/netcdf_47.prj') ############################################################################### # Test reading a vector NetCDF 3 file without any geometry def test_netcdf_48(): if gdaltest.netcdf_drv is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('data/netcdf/test_ogr_no_xyz_var.nc', gdal.OF_VECTOR) lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbNone f = lyr.GetNextFeature() assert f['int32'] == 1 ############################################################################### # Test reading a vector NetCDF 3 file with X,Y,Z vars as float def test_netcdf_49(): if gdaltest.netcdf_drv is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('data/netcdf/test_ogr_xyz_float.nc', gdal.OF_VECTOR) gdal.VectorTranslate('/vsimem/netcdf_49.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_49.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,int32 "POINT Z (1 2 3)",1 "POINT (1 2)", ,, """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_49.csv') ############################################################################### # Test creating a vector NetCDF 3 file with WKT geometry field def test_netcdf_50(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_VECTOR) out_ds = gdal.VectorTranslate('tmp/netcdf_50.nc', ds, format='netCDF', layerCreationOptions=['WKT_DEFAULT_WIDTH=1'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) src_lyr = ds.GetLayer(0) src_lyr.ResetReading() out_lyr = out_ds.GetLayer(0) out_lyr.ResetReading() src_f = src_lyr.GetNextFeature() out_f = out_lyr.GetNextFeature() src_f.SetFID(-1) out_f.SetFID(-1) src_json = src_f.ExportToJson() out_json = out_f.ExportToJson() assert src_json == out_json out_ds = None out_ds = gdal.OpenEx('tmp/netcdf_50.nc', gdal.OF_VECTOR) out_lyr = out_ds.GetLayer(0) srs = out_lyr.GetSpatialRef().ExportToWkt() assert 'PROJCS["OSGB 1936' in srs out_f = out_lyr.GetNextFeature() out_f.SetFID(-1) out_json = out_f.ExportToJson() assert src_json == out_json out_ds = None gdal.Unlink('tmp/netcdf_50.nc') ############################################################################### # Test creating a vector NetCDF 3 file with X,Y,Z fields def test_netcdf_51(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_VECTOR) # Test autogrow of string fields gdal.VectorTranslate('tmp/netcdf_51.nc', ds, format='netCDF', layerCreationOptions=['STRING_DEFAULT_WIDTH=1'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) with gdaltest.error_handler(): ds = gdal.OpenEx('tmp/netcdf_51.nc', gdal.OF_VECTOR) gdal.VectorTranslate('/vsimem/netcdf_51.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) ds = None fp = gdal.VSIFOpenL('/vsimem/netcdf_51.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string1char,string3chars,twodimstringchar,date,datetime_explicit_fillValue,datetime,int64var,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,x,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,1234567890123,1,1,1.2,1.2,123,12,5,-125 "POINT Z (1 2 0)",,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,, """ assert content == expected_content fp = gdal.VSIFOpenL('/vsimem/netcdf_51.csvt', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(1),String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer """ assert content == expected_content ds = gdal.OpenEx('tmp/netcdf_51.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) lyr.CreateField(ogr.FieldDefn('extra', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('extra_str', ogr.OFTString)) f = lyr.GetNextFeature() assert f is not None f['extra'] = 5 f['extra_str'] = 'foobar' assert lyr.CreateFeature(f) == 0 ds = None ds = gdal.OpenEx('tmp/netcdf_51.nc', gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) assert f['int32'] == 1 and f['extra'] == 5 and f['extra_str'] == 'foobar' f = None ds = None import netcdf_cf netcdf_cf.netcdf_cf_setup() if gdaltest.netcdf_cf_method is not None: netcdf_cf.netcdf_cf_check_file('tmp/netcdf_51.nc', 'auto', False) gdal.Unlink('tmp/netcdf_51.nc') gdal.Unlink('tmp/netcdf_51.csv') gdal.Unlink('tmp/netcdf_51.csvt') gdal.Unlink('/vsimem/netcdf_51.csv') gdal.Unlink('/vsimem/netcdf_51.csvt') gdal.Unlink('/vsimem/netcdf_51.prj') ############################################################################### # Test creating a vector NetCDF 3 file with X,Y,Z fields with WRITE_GDAL_TAGS=NO def test_netcdf_51_no_gdal_tags(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.OpenEx('data/netcdf/test_ogr_nc3.nc', gdal.OF_VECTOR) gdal.VectorTranslate('tmp/netcdf_51_no_gdal_tags.nc', ds, format='netCDF', datasetCreationOptions=['WRITE_GDAL_TAGS=NO', 'GEOMETRY_ENCODING=WKT']) with gdaltest.error_handler(): ds = gdal.OpenEx('tmp/netcdf_51_no_gdal_tags.nc', gdal.OF_VECTOR) gdal.VectorTranslate('/vsimem/netcdf_51_no_gdal_tags.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) ds = None fp = gdal.VSIFOpenL('/vsimem/netcdf_51_no_gdal_tags.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string1char,string3chars,twodimstringchar,date,datetime_explicit_fillValue,datetime,int64var,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x1,byte_field "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,x,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,1234567890123,1,1,1.2,1.2,123,12,5,-125 "POINT Z (1 2 0)",,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,, """ assert content == expected_content fp = gdal.VSIFOpenL('/vsimem/netcdf_51_no_gdal_tags.csvt', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(1),String(3),String(10),Date,DateTime,DateTime,Real,Real,Integer,Integer,Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer """ assert content == expected_content gdal.Unlink('tmp/netcdf_51_no_gdal_tags.nc') gdal.Unlink('tmp/netcdf_51_no_gdal_tags.csv') gdal.Unlink('tmp/netcdf_51_no_gdal_tags.csvt') gdal.Unlink('/vsimem/netcdf_51_no_gdal_tags.csv') gdal.Unlink('/vsimem/netcdf_51_no_gdal_tags.csvt') gdal.Unlink('/vsimem/netcdf_51_no_gdal_tags.prj') ############################################################################### # Test creating a vector NetCDF 4 file with X,Y,Z fields def test_netcdf_52(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() if gdaltest.netcdf_drv_version in ('4.6.3', '4.7.0'): pytest.skip('buggy netCDF version: https://github.com/Unidata/netcdf-c/pull/1442') ds = gdal.OpenEx('data/netcdf/test_ogr_nc4.nc', gdal.OF_VECTOR) gdal.VectorTranslate('tmp/netcdf_52.nc', ds, format='netCDF', datasetCreationOptions=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT']) with gdaltest.error_handler(): ds = gdal.OpenEx('tmp/netcdf_52.nc', gdal.OF_VECTOR) gdal.VectorTranslate('/vsimem/netcdf_52.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'CREATE_CSVT=YES', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) ds = None fp = gdal.VSIFOpenL('/vsimem/netcdf_52.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,int32,int32_explicit_fillValue,float64,float64_explicit_fillValue,string3chars,twodimstringchar,date,datetime,datetime_explicit_fillValue,int64,int64var_explicit_fillValue,boolean,boolean_explicit_fillValue,float32,float32_explicit_fillValue,int16,int16_explicit_fillValue,x,byte_field,ubyte_field,ubyte_field_explicit_fillValue,ushort_field,ushort_field_explicit_fillValue,uint_field,uint_field_explicit_fillValue,uint64_field,uint64_field_explicit_fillValue "POINT Z (1 2 3)",1,1,1.23456789012,1.23456789012,STR,STR,1970/01/02,2016/02/06 12:34:56.789,2016/02/06 12:34:56.789,1234567890123,,1,1,1.2,1.2,123,12,5,-125,254,255,65534,65535,4000000000,4294967295,1234567890123, "POINT Z (1 2 0)",,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,, """ assert content == expected_content fp = gdal.VSIFOpenL('/vsimem/netcdf_52.csvt', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,Integer,Integer,Real,Real,String(3),String,Date,DateTime,DateTime,Integer64,Integer64,Integer(Boolean),Integer(Boolean),Real(Float32),Real(Float32),Integer(Int16),Integer(Int16),Real,Integer,Integer,Integer,Integer,Integer,Integer64,Integer64,Real,Real """ assert content == expected_content ds = gdal.OpenEx('tmp/netcdf_52.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) lyr.CreateField(ogr.FieldDefn('extra', ogr.OFTInteger)) f = lyr.GetNextFeature() assert f is not None f['extra'] = 5 assert lyr.CreateFeature(f) == 0 ds = None ds = gdal.OpenEx('tmp/netcdf_52.nc', gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) assert f['int32'] == 1 and f['extra'] == 5 f = None ds = None import netcdf_cf netcdf_cf.netcdf_cf_setup() if gdaltest.netcdf_cf_method is not None: netcdf_cf.netcdf_cf_check_file('tmp/netcdf_52.nc', 'auto', False) gdal.Unlink('tmp/netcdf_52.nc') gdal.Unlink('tmp/netcdf_52.csv') gdal.Unlink('tmp/netcdf_52.csvt') gdal.Unlink('/vsimem/netcdf_52.csv') gdal.Unlink('/vsimem/netcdf_52.csvt') gdal.Unlink('/vsimem/netcdf_52.prj') ############################################################################### # Test creating a vector NetCDF 4 file with WKT geometry field def test_netcdf_53(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_VECTOR) out_ds = gdal.VectorTranslate('tmp/netcdf_53.nc', ds, format='netCDF', datasetCreationOptions=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT']) src_lyr = ds.GetLayer(0) src_lyr.ResetReading() out_lyr = out_ds.GetLayer(0) out_lyr.ResetReading() src_f = src_lyr.GetNextFeature() out_f = out_lyr.GetNextFeature() src_f.SetFID(-1) out_f.SetFID(-1) src_json = src_f.ExportToJson() out_json = out_f.ExportToJson() assert src_json == out_json out_ds = None out_ds = gdal.OpenEx('tmp/netcdf_53.nc', gdal.OF_VECTOR) out_lyr = out_ds.GetLayer(0) srs = out_lyr.GetSpatialRef().ExportToWkt() assert 'PROJCS["OSGB 1936' in srs out_f = out_lyr.GetNextFeature() out_f.SetFID(-1) out_json = out_f.ExportToJson() assert src_json == out_json out_ds = None gdal.Unlink('tmp/netcdf_53.nc') ############################################################################### # Test appending to a vector NetCDF 4 file with unusual types (ubyte, ushort...) def test_netcdf_54(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() if gdaltest.netcdf_drv_version in ('4.6.3', '4.7.0'): pytest.skip('buggy netCDF version: https://github.com/Unidata/netcdf-c/pull/1442') shutil.copy('data/netcdf/test_ogr_nc4.nc', 'tmp/netcdf_54.nc') ds = gdal.OpenEx('tmp/netcdf_54.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None f['int32'] += 1 f.SetFID(-1) f.ExportToJson() src_json = f.ExportToJson() assert lyr.CreateFeature(f) == 0 ds = None ds = gdal.OpenEx('tmp/netcdf_54.nc', gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) f.SetFID(-1) out_json = f.ExportToJson() f = None ds = None gdal.Unlink('tmp/netcdf_54.nc') assert src_json == out_json ############################################################################### # Test auto-grow of bidimensional char variables in a vector NetCDF 4 file def test_netcdf_55(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() shutil.copy('data/netcdf/test_ogr_nc4.nc', 'tmp/netcdf_55.nc') ds = gdal.OpenEx('tmp/netcdf_55.nc', gdal.OF_VECTOR | gdal.OF_UPDATE) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None f['twodimstringchar'] = 'abcd' f.SetFID(-1) f.ExportToJson() src_json = f.ExportToJson() assert lyr.CreateFeature(f) == 0 ds = None ds = gdal.OpenEx('tmp/netcdf_55.nc', gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) f.SetFID(-1) out_json = f.ExportToJson() f = None ds = None gdal.Unlink('tmp/netcdf_55.nc') assert src_json == out_json ############################################################################### # Test truncation of bidimensional char variables and WKT in a vector NetCDF 3 file def test_netcdf_56(): if gdaltest.netcdf_drv is None: pytest.skip() ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_56.nc', options=['GEOMETRY_ENCODING=WKT']) # Test auto-grow of WKT field lyr = ds.CreateLayer('netcdf_56', options=['AUTOGROW_STRINGS=NO', 'STRING_DEFAULT_WIDTH=5', 'WKT_DEFAULT_WIDTH=5']) lyr.CreateField(ogr.FieldDefn('txt')) f = ogr.Feature(lyr.GetLayerDefn()) f['txt'] = '0123456789' f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) with gdaltest.error_handler(): ret = lyr.CreateFeature(f) assert ret == 0 ds = None ds = gdal.OpenEx('tmp/netcdf_56.nc', gdal.OF_VECTOR) lyr = ds.GetLayer(0) f = lyr.GetFeature(lyr.GetFeatureCount()) if f['txt'] != '01234' or f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() ds = None gdal.Unlink('tmp/netcdf_56.nc') ############################################################################### # Test one layer per file creation def test_netcdf_57(): if gdaltest.netcdf_drv is None: pytest.skip() try: shutil.rmtree('tmp/netcdf_57') except OSError: pass with gdaltest.error_handler(): ds = ogr.GetDriverByName('netCDF').CreateDataSource('/not_existing_dir/invalid_subdir', options=['MULTIPLE_LAYERS=SEPARATE_FILES', 'GEOMETRY_ENCODING=WKT']) assert ds is None open('tmp/netcdf_57', 'wb').close() with gdaltest.error_handler(): ds = ogr.GetDriverByName('netCDF').CreateDataSource('/not_existing_dir/invalid_subdir', options=['MULTIPLE_LAYERS=SEPARATE_FILES', 'GEOMETRY_ENCODING=WKT']) assert ds is None os.unlink('tmp/netcdf_57') ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_57', options=['MULTIPLE_LAYERS=SEPARATE_FILES', 'GEOMETRY_ENCODING=WKT']) for ilayer in range(2): lyr = ds.CreateLayer('lyr%d' % ilayer) lyr.CreateField(ogr.FieldDefn('lyr_id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['lyr_id'] = ilayer lyr.CreateFeature(f) ds = None for ilayer in range(2): ds = ogr.Open('tmp/netcdf_57/lyr%d.nc' % ilayer) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['lyr_id'] == ilayer ds = None shutil.rmtree('tmp/netcdf_57') ############################################################################### # Test one layer per group (NC4) def test_netcdf_58(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_58.nc', options=['FORMAT=NC4', 'MULTIPLE_LAYERS=SEPARATE_GROUPS', 'GEOMETRY_ENCODING=WKT']) for ilayer in range(2): # Make sure auto-grow will happen to test this works well with multiple groups lyr = ds.CreateLayer('lyr%d' % ilayer, geom_type=ogr.wkbNone, options=['USE_STRING_IN_NC4=NO', 'STRING_DEFAULT_WIDTH=1']) lyr.CreateField(ogr.FieldDefn('lyr_id', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f['lyr_id'] = 'lyr_%d' % ilayer lyr.CreateFeature(f) ds = None ds = ogr.Open('tmp/netcdf_58.nc') for ilayer in range(2): lyr = ds.GetLayer(ilayer) f = lyr.GetNextFeature() assert f['lyr_id'] == 'lyr_%d' % ilayer ds = None gdal.Unlink('tmp/netcdf_58.nc') ############################################################################### # check for UnitType set/get. def test_netcdf_59(): if gdaltest.netcdf_drv is None: pytest.skip() # get ds = gdal.Open('data/netcdf/unittype.nc') unit = ds.GetRasterBand(1).GetUnitType() assert unit == 'm/s', ('Incorrect unit(%s)' % unit) ds = None # set tst = gdaltest.GDALTest('NetCDF', 'netcdf/unittype.nc', 1, 4672) return tst.testSetUnitType() ############################################################################### # Test reading a "Indexed ragged array representation of profiles" v1.6.0 H3.5 # http://cfconventions.org/cf-conventions/v1.6.0/cf-conventions.html#_indexed_ragged_array_representation_of_profiles def test_netcdf_60(): if gdaltest.netcdf_drv is None: pytest.skip() # Test that a vector cannot be opened in raster-only mode ds = gdal.OpenEx('data/netcdf/profile.nc', gdal.OF_RASTER) assert ds is None ds = gdal.OpenEx('data/netcdf/profile.nc', gdal.OF_VECTOR) assert ds is not None with gdaltest.error_handler(): gdal.VectorTranslate('/vsimem/netcdf_60.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_60.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo "POINT Z (2 49 100)",1,1,Palo Alto,bar "POINT Z (3 50 50)",2,2,Santa Fe,baz "POINT Z (2 49 200)",1,3,Palo Alto,baw "POINT Z (3 50 100)",2,4,Santa Fe,baz2 """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_60.csv') ############################################################################### # Test appending to a "Indexed ragged array representation of profiles" v1.6.0 H3.5 def test_netcdf_61(): if gdaltest.netcdf_drv is None: pytest.skip() shutil.copy('data/netcdf/profile.nc', 'tmp/netcdf_61.nc') ds = gdal.VectorTranslate('tmp/netcdf_61.nc', 'data/netcdf/profile.nc', accessMode='append') gdal.VectorTranslate('/vsimem/netcdf_61.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_61.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo "POINT Z (2 49 100)",1,1,Palo Alto,bar "POINT Z (3 50 50)",2,2,Santa Fe,baz "POINT Z (2 49 200)",1,3,Palo Alto,baw "POINT Z (3 50 100)",2,4,Santa Fe,baz2 "POINT Z (2 49 100)",1,1,Palo Alto,bar "POINT Z (3 50 50)",2,2,Santa Fe,baz "POINT Z (2 49 200)",1,3,Palo Alto,baw "POINT Z (3 50 100)",2,4,Santa Fe,baz2 """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_61.csv') gdal.Unlink('/vsimem/netcdf_61.nc') ############################################################################### # Test creating a "Indexed ragged array representation of profiles" v1.6.0 H3.5 def test_netcdf_62(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.VectorTranslate('tmp/netcdf_62.nc', 'data/netcdf/profile.nc', format='netCDF', layerCreationOptions=['FEATURE_TYPE=PROFILE', 'PROFILE_DIM_INIT_SIZE=1', 'PROFILE_VARIABLES=station'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) gdal.VectorTranslate('/vsimem/netcdf_62.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_62.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo "POINT Z (2 49 100)",1,1,Palo Alto,bar "POINT Z (3 50 50)",2,2,Santa Fe,baz "POINT Z (2 49 200)",1,3,Palo Alto,baw "POINT Z (3 50 100)",2,4,Santa Fe,baz2 """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_62.csv') def test_netcdf_62_ncdump_check(): if gdaltest.netcdf_drv is None: pytest.skip() # get file header with ncdump (if available) try: (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') except OSError: err = None if err is not None and 'netcdf library version' in err: (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h tmp/netcdf_62.nc') assert ('profile = 2' in ret and \ 'record = UNLIMITED' in ret and \ 'profile:cf_role = "profile_id"' in ret and \ 'parentIndex:instance_dimension = "profile"' in ret and \ ':featureType = "profile"' in ret and \ 'char station(profile' in ret and \ 'char foo(record' in ret) else: pytest.skip() def test_netcdf_62_cf_check(): if gdaltest.netcdf_drv is None: pytest.skip() import netcdf_cf netcdf_cf.netcdf_cf_setup() if gdaltest.netcdf_cf_method is not None: netcdf_cf.netcdf_cf_check_file('tmp/netcdf_62.nc', 'auto', False) gdal.Unlink('/vsimem/netcdf_62.nc') ############################################################################### # Test creating a NC4 "Indexed ragged array representation of profiles" v1.6.0 H3.5 def test_netcdf_63(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() shutil.copy('data/netcdf/profile.nc', 'tmp/netcdf_63.nc') ds = gdal.VectorTranslate('tmp/netcdf_63.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT'], layerCreationOptions=['FEATURE_TYPE=PROFILE', \ 'USE_STRING_IN_NC4=NO', 'STRING_DEFAULT_WIDTH=1']) gdal.VectorTranslate('/vsimem/netcdf_63.csv', ds, format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_63.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,station,foo "POINT Z (2 49 100)",1,1,Palo Alto,bar "POINT Z (3 50 50)",2,2,Santa Fe,baz "POINT Z (2 49 200)",1,3,Palo Alto,baw "POINT Z (3 50 100)",2,4,Santa Fe,baz2 """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_63.csv') def test_netcdf_63_ncdump_check(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() # get file header with ncdump (if available) try: (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') except OSError: err = None if err is not None and 'netcdf library version' in err: (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h tmp/netcdf_63.nc') assert ('profile = UNLIMITED' in ret and \ 'record = UNLIMITED' in ret and \ 'profile:cf_role = "profile_id"' in ret and \ 'parentIndex:instance_dimension = "profile"' in ret and \ ':featureType = "profile"' in ret and \ 'char station(record' in ret) else: gdal.Unlink('/vsimem/netcdf_63.nc') pytest.skip() gdal.Unlink('/vsimem/netcdf_63.nc') ############################################################################### # Test creating a "Indexed ragged array representation of profiles" v1.6.0 H3.5 # but without a profile field. def test_netcdf_64(): if gdaltest.netcdf_drv is None: pytest.skip() gdal.VectorTranslate('tmp/netcdf_64.nc', 'data/netcdf/profile.nc', format='netCDF', selectFields=['id,station,foo'], layerCreationOptions=['FEATURE_TYPE=PROFILE', 'PROFILE_DIM_NAME=profile_dim', 'PROFILE_DIM_INIT_SIZE=1', 'LEGACY=WKT'], datasetCreationOptions=['GEOMETRY_ENCODING=WKT']) gdal.VectorTranslate('/vsimem/netcdf_64.csv', 'tmp/netcdf_64.nc', format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_64.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,profile_dim,id,station,foo "POINT Z (2 49 100)",0,1,Palo Alto,bar "POINT Z (3 50 50)",1,2,Santa Fe,baz "POINT Z (2 49 200)",0,3,Palo Alto,baw "POINT Z (3 50 100)",1,4,Santa Fe,baz2 """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_64.csv') gdal.Unlink('/vsimem/netcdf_64.nc') ############################################################################### # Test creating a NC4 file with empty string fields / WKT fields # (they must be filled as empty strings to avoid crashes in netcdf lib) def test_netcdf_65(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ds = ogr.GetDriverByName('netCDF').CreateDataSource('tmp/netcdf_65.nc', options=['FORMAT=NC4', 'GEOMETRY_ENCODING=WKT']) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None ds = ogr.Open('tmp/netcdf_65.nc') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['str'] != '': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('tmp/netcdf_65.nc') ############################################################################### # Test creating a "Indexed ragged array representation of profiles" v1.6.0 H3.5 # from a config file def test_netcdf_66(): if gdaltest.netcdf_drv is None: pytest.skip() # First trying with no so good configs with gdaltest.error_handler(): gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=not_existing']) with gdaltest.error_handler(): gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=']) myconfig = \ """ """ with gdaltest.error_handler(): gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=' + myconfig, 'GEOMETRY_ENCODING=WKT']) # Now with a correct configuration myconfig = \ """ """ gdal.VectorTranslate('tmp/netcdf_66.nc', 'data/netcdf/profile.nc', format='netCDF', datasetCreationOptions=['CONFIG_FILE=' + myconfig, 'GEOMETRY_ENCODING=WKT']) gdal.VectorTranslate('/vsimem/netcdf_66.csv', 'tmp/netcdf_66.nc', format='CSV', layerCreationOptions=['LINEFORMAT=LF', 'GEOMETRY=AS_WKT', 'STRING_QUOTING=IF_NEEDED']) fp = gdal.VSIFOpenL('/vsimem/netcdf_66.csv', 'rb') if fp is not None: content = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) expected_content = """WKT,profile,id,my_station,foo "POINT Z (2 49 100)",1,1,Palo Alto,bar "POINT Z (3 50 50)",2,2,Santa Fe,baz "POINT Z (2 49 200)",1,3,Palo Alto,baw "POINT Z (3 50 100)",2,4,Santa Fe,baz2 """ assert content == expected_content gdal.Unlink('/vsimem/netcdf_66.csv') def test_netcdf_66_ncdump_check(): if gdaltest.netcdf_drv is None: pytest.skip() # get file header with ncdump (if available) try: (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h') except OSError: err = None if err is not None and 'netcdf library version' in err: (ret, err) = gdaltest.runexternal_out_and_err('ncdump -h tmp/netcdf_66.nc') assert ('char my_station(obs, my_station_max_width)' in ret and \ 'my_station:long_name = "my station attribute"' in ret and \ 'lon:my_extra_lon_attribute = "foo"' in ret and \ 'lat:long_name' not in ret and \ 'id:my_extra_attribute = 5.23' in ret and \ 'profile:cf_role = "profile_id"' in ret and \ 'parentIndex:instance_dimension = "profile"' in ret and \ ':featureType = "profile"' in ret) else: gdal.Unlink('/vsimem/netcdf_66.nc') pytest.skip() gdal.Unlink('/vsimem/netcdf_66.nc') ############################################################################### # ticket #5950: optimize IReadBlock() and CheckData() handling of partial # blocks in the x axischeck for partial block reading. def test_netcdf_67(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() try: import numpy except ImportError: pytest.skip() # disable bottom-up mode to use the real file's blocks size gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', 'NO') # for the moment the next test using check_stat does not work, seems like # the last pixel (9) of the image is not handled by stats... # tst = gdaltest.GDALTest( 'NetCDF', 'partial_block_ticket5950.nc', 1, 45 ) # result = tst.testOpen( check_stat=(1, 9, 5, 2.582) ) # so for the moment compare the full image ds = gdal.Open('data/netcdf/partial_block_ticket5950.nc', gdal.GA_ReadOnly) ref = numpy.arange(1, 10).reshape((3, 3)) if not numpy.array_equal(ds.GetRasterBand(1).ReadAsArray(), ref): pytest.fail() ds = None gdal.SetConfigOption('GDAL_NETCDF_BOTTOMUP', None) ############################################################################### # Test reading SRS from srid attribute (#6613) def test_netcdf_68(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/srid.nc') wkt = ds.GetProjectionRef() assert '6933' in wkt ############################################################################### # Test opening a dataset with a 1D variable with 0 record (#6645) def test_netcdf_69(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/test6645.nc') assert ds is not None ############################################################################### # Test that we don't erroneously identify non-longitude axis as longitude (#6759) def test_netcdf_70(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/test6759.nc') gt = ds.GetGeoTransform() expected_gt = [304250.0, 250.0, 0.0, 4952500.0, 0.0, -250.0] assert max(abs(gt[i] - expected_gt[i]) for i in range(6)) <= 1e-3 ############################################################################### # Test that we take into account x and y offset and scaling # (https://github.com/OSGeo/gdal/pull/200) def test_netcdf_71(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/test_coord_scale_offset.nc') gt = ds.GetGeoTransform() expected_gt = (-690769.999174516, 1015.8812500000931, 0.0, 2042963.9463741186, 0.0, -1015.8812499996275) assert gt == pytest.approx(expected_gt, abs=1e-3) ############################################################################### # test int64 attributes / dim def test_netcdf_72(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ds = gdal.Open('data/netcdf/int64dim.nc') mdi = ds.GetRasterBand(1).GetMetadataItem('NETCDF_DIM_TIME') assert mdi == '123456789012' ############################################################################### # test geostationary with radian units (https://github.com/OSGeo/gdal/pull/220) def test_netcdf_73(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/geos_rad.nc') gt = ds.GetGeoTransform() expected_gt = (-5979486.362104082, 1087179.4077774752, 0.0, 5979486.362104082, 0.0, -1087179.4077774752) assert gt == pytest.approx(expected_gt, abs=1e-3) ############################################################################### # test geostationary with microradian units (https://github.com/OSGeo/gdal/pull/220) def test_netcdf_74(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/geos_microradian.nc') gt = ds.GetGeoTransform() expected_gt = (-5739675.119757546, 615630.8078590936, 0.0, 5739675.119757546, 0.0, -615630.8078590936) assert gt == pytest.approx(expected_gt, abs=1e-3) ############################################################################### # test opening a ncdump file def test_netcdf_75(): if gdaltest.netcdf_drv is None: pytest.skip() if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != 'YES': pytest.skip() tst = gdaltest.GDALTest('NetCDF', 'netcdf/byte.nc.txt', 1, 4672) wkt = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982139006, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26711"]]""" return tst.testOpen(check_prj=wkt) ############################################################################### # test opening a vector ncdump file def test_netcdf_76(): if gdaltest.netcdf_drv is None: pytest.skip() if gdaltest.netcdf_drv.GetMetadataItem("ENABLE_NCDUMP") != 'YES': pytest.skip() ds = ogr.Open('data/netcdf/poly.nc.txt') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f is None or f.GetGeometryRef() is None: f.DumpReadable() pytest.fail() ############################################################################### # test opening a raster file that used to be confused with a vector file (#6974) def test_netcdf_77(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/fake_Oa01_radiance.nc') subdatasets = ds.GetMetadata('SUBDATASETS') assert len(subdatasets) == 2 * 2 ds = gdal.Open('NETCDF:"data/netcdf/fake_Oa01_radiance.nc":Oa01_radiance') assert not ds.GetMetadata('GEOLOCATION') ############################################################################### # test we handle correctly valid_range={0,255} for a byte dataset with # negative nodata value def test_netcdf_78(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/byte_with_valid_range.nc') assert ds.GetRasterBand(1).GetNoDataValue() == 240 data = ds.GetRasterBand(1).ReadRaster() data = struct.unpack('B' * 4, data) assert data == (128, 129, 126, 127) ############################################################################### # test we handle correctly _Unsigned="true" for a byte dataset with # negative nodata value def test_netcdf_79(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/byte_with_neg_fillvalue_and_unsigned_hint.nc') assert ds.GetRasterBand(1).GetNoDataValue() == 240 data = ds.GetRasterBand(1).ReadRaster() data = struct.unpack('B' * 4, data) assert data == (128, 129, 126, 127) ############################################################################### # Test creating and opening with accent def test_netcdf_80(): if gdaltest.netcdf_drv is None: pytest.skip() test = gdaltest.GDALTest('NETCDF', '../data/byte.tif', 1, 4672) return test.testCreateCopy(new_filename='test\xc3\xa9.nc', check_gt=0, check_srs=0, check_minmax=0) ############################################################################### # netCDF file in rotated_pole projection def test_netcdf_81(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/rotated_pole.nc') assert ds.RasterXSize == 137 and ds.RasterYSize == 108, \ 'Did not get expected dimensions' projection = ds.GetProjectionRef() # Before PROJ 7.0.1 deprecated_expected_projection = """PROJCS["unnamed",GEOGCS["unknown",DATUM["unnamed",SPHEROID["Spheroid",6367470,594.313048347956]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Rotated_pole"],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=ob_tran +o_proj=longlat +lon_0=18 +o_lon_p=0 +o_lat_p=39.25 +a=6367470 +b=6367470 +to_meter=0.0174532925199 +wktext"]]""" expected_projection = """GEOGCRS["unnamed",BASEGEOGCRS["unknown",DATUM["unknown",ELLIPSOID["unknown",6367470,0,LENGTHUNIT["metre",1,ID["EPSG",9001]]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8901]]],DERIVINGCONVERSION["unknown",METHOD["PROJ ob_tran o_proj=longlat"],PARAMETER["lon_0",18,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lon_p",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["o_lat_p",39.25,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["longitude",east,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["latitude",north,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]""" assert projection in (expected_projection, deprecated_expected_projection) gt = ds.GetGeoTransform() expected_gt = (-35.47, 0.44, 0.0, 23.65, 0.0, -0.44) assert max([abs(gt[i] - expected_gt[i]) for i in range(6)]) <= 1e-3, \ 'Did not get expected geotransform' ############################################################################### # netCDF file with extra dimensions that are oddly indexed (1D variable # corresponding to the dimension but with a different name, no corresponding # 1D variable, several corresponding variables) def test_netcdf_82(): if gdaltest.netcdf_drv is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/netcdf/oddly_indexed_extra_dims.nc') md = ds.GetMetadata() expected_md = { 'NETCDF_DIM_extra_dim_with_var_of_different_name_VALUES': '{100,200}', 'NETCDF_DIM_EXTRA': '{extra_dim_with_several_variables,extra_dim_without_variable,extra_dim_with_var_of_different_name}', 'x#standard_name': 'projection_x_coordinate', 'NC_GLOBAL#Conventions': 'CF-1.5', 'y#standard_name': 'projection_y_coordinate', 'NETCDF_DIM_extra_dim_with_var_of_different_name_DEF': '{2,6}' } assert md == expected_md, 'Did not get expected metadata' md = ds.GetRasterBand(1).GetMetadata() expected_md = { 'NETCDF_DIM_extra_dim_with_several_variables': '1', 'NETCDF_DIM_extra_dim_with_var_of_different_name': '100', 'NETCDF_DIM_extra_dim_without_variable': '1', 'NETCDF_VARNAME': 'data' } assert md == expected_md, 'Did not get expected metadata' ############################################################################### # Test complex data subsets def test_netcdf_83(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/complex.nc') sds_list = ds.GetMetadata('SUBDATASETS') assert len(sds_list) == 6, 'Did not get expected complex subdataset count.' assert sds_list['SUBDATASET_1_NAME'] == 'NETCDF:"data/netcdf/complex.nc":f32' and sds_list['SUBDATASET_2_NAME'] == 'NETCDF:"data/netcdf/complex.nc":f64' and sds_list['SUBDATASET_3_NAME'] == 'NETCDF:"data/netcdf/complex.nc":/group/fmul', \ 'did not get expected subdatasets.' ds = None assert not gdaltest.is_file_open('data/netcdf/complex.nc'), 'file still opened.' ############################################################################### # Confirm complex subset data access and checksum # Start with Float32 def test_netcdf_84(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('NETCDF:"data/netcdf/complex.nc":f32') assert ds.GetRasterBand(1).DataType == gdal.GDT_CFloat32 cs = ds.GetRasterBand(1).Checksum() assert cs == 523, 'did not get expected checksum' # Repeat for Float64 def test_netcdf_85(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('NETCDF:"data/netcdf/complex.nc":f64') assert ds.GetRasterBand(1).DataType == gdal.GDT_CFloat64 cs = ds.GetRasterBand(1).Checksum() assert cs == 511, 'did not get expected checksum' # Check for groups support def test_netcdf_86(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('NETCDF:"data/netcdf/complex.nc":/group/fmul') assert ds.GetRasterBand(1).DataType == gdal.GDT_CFloat32 cs = ds.GetRasterBand(1).Checksum() assert cs == 453, 'did not get expected checksum for band 1' cs = ds.GetRasterBand(2).Checksum() assert cs == 629, 'did not get expected checksum for band 2' cs = ds.GetRasterBand(3).Checksum() assert cs == 473, 'did not get expected checksum for band 3' ############################################################################### def test_netcdf_uffd(): if gdaltest.netcdf_drv is None: pytest.skip() if uffd_compare('netcdf/orog_CRCM1.nc') is None: pytest.skip() netcdf_files = [ 'orog_CRCM1.nc', 'orog_CRCM2.nc', 'cf-bug636.nc', 'bug636.nc', 'rotated_pole.nc', 'reduce-cgcms.nc' ] for netcdf_file in netcdf_files: assert uffd_compare('netcdf/' + netcdf_file) is True ############################################################################### # netCDF file containing both rasters and vectors def test_netcdf_mixed_raster_vector(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('NETCDF:data/netcdf/nc_mixed_raster_vector.nc:Band1') assert ds.GetRasterBand(1).Checksum() == 4672 ds = ogr.Open('data/netcdf/nc_mixed_raster_vector.nc') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['PRFEDEA'] == '35043411' ############################################################################### # Test opening a file with an empty double attribute # https://github.com/OSGeo/gdal/issues/1303 def test_netcdf_open_empty_double_attr(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/empty_double_attr.nc') assert ds ############################################################################### # Test writing and reading a file with huge block size def test_netcdf_huge_block_size(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() if sys.maxsize < 2**32: pytest.skip('Test not available on 32 bit') import psutil if psutil.virtual_memory().available < 2 * 50000 * 50000: pytest.skip("Not enough virtual memory available") tmpfilename = 'tmp/test_netcdf_huge_block_size.nc' with gdaltest.SetCacheMax(50000 * 50000 + 100000): with gdaltest.config_option('BLOCKYSIZE', '50000'): gdal.Translate(tmpfilename, '../gcore/data/byte.tif', options='-f netCDF -outsize 50000 50000 -co WRITE_BOTTOMUP=NO -co COMPRESS=DEFLATE -co FORMAT=NC4') ds = gdal.Open(tmpfilename) data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) assert data ref_ds = gdal.Open('../gcore/data/byte.tif') assert data == ref_ds.ReadRaster() ds = None gdal.Unlink(tmpfilename) ############################################################################### # Test reading a netCDF file whose fastest varying dimension is Latitude, and # slowest one is Longitude # https://lists.osgeo.org/pipermail/gdal-dev/2019-March/049931.html # Currently we expose it in a 'raw' way, but make sure that geotransform and # geoloc arrays reflect the georeferencing correctly def test_netcdf_swapped_x_y_dimension(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/swapedxy.nc') assert ds.RasterXSize == 4 assert ds.RasterYSize == 8 assert ds.GetGeoTransform() == (90.0, -45.0, 0, -180, 0.0, 45.0) data = ds.GetRasterBand(1).ReadRaster() data = struct.unpack('h' * 4 * 8, data) assert data == (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13 ,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31) md = ds.GetMetadata('GEOLOCATION') assert md == { 'LINE_OFFSET': '0', 'X_DATASET': 'NETCDF:"data/netcdf/swapedxy.nc":Latitude', 'SWAP_XY': 'YES', 'PIXEL_STEP': '1', 'SRS': 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]', 'PIXEL_OFFSET': '0', 'X_BAND': '1', 'LINE_STEP': '1', 'Y_DATASET': 'NETCDF:"data/netcdf/swapedxy.nc":Longitude', 'Y_BAND': '1'}, md ds = gdal.Open(md['X_DATASET']) assert ds.RasterXSize == 4 assert ds.RasterYSize == 1 data = ds.GetRasterBand(1).ReadRaster() data = struct.unpack('f' * 4, data) assert data == (67.5, 22.5, -22.5, -67.5) ds = gdal.Open(md['Y_DATASET']) assert ds.RasterXSize == 8 assert ds.RasterYSize == 1 data = ds.GetRasterBand(1).ReadRaster() data = struct.unpack('f' * 8, data) assert data == (-157.5, -112.5, -67.5, -22.5, 22.5, 67.5, 112.5, 157.5) ds = gdal.Warp('', 'data/netcdf/swapedxy.nc', options = '-f MEM -geoloc') assert ds.RasterXSize == 8 assert ds.RasterYSize == 4 assert ds.GetGeoTransform() == (-157.5, 38.3161193233344, 0.0, 67.5, 0.0, -38.3161193233344) data = ds.GetRasterBand(1).ReadRaster() data = struct.unpack('h' * 4 * 8, data) # not exactly the transposed array, but not so far assert data == (4, 8, 8, 12, 16, 20, 20, 24, 5, 9, 9, 13, 17, 21, 21, 25, 6, 10, 10, 14, 18, 22, 22, 26, 7, 11, 11, 15, 19, 23, 23, 27) ############################################################################### # Test reading a netCDF file whose grid_mapping attribute uses an # expanded form def test_netcdf_expanded_form_of_grid_mapping(): if gdaltest.netcdf_drv is None: pytest.skip() ds = gdal.Open('data/netcdf/expanded_form_of_grid_mapping.nc') wkt = ds.GetProjectionRef() assert 'Transverse_Mercator' in wkt ############################################################################### ############################################################################### # main tests list ############################################################################### # basic file creation tests init_list = [ ('byte.tif', 4672, []), ('gtiff/byte_signed.tif', 4672, ['PIXELTYPE=SIGNEDBYTE']), ('int16.tif', 4672, []), ('int32.tif', 4672, []), ('float32.tif', 4672, []), ('float64.tif', 4672, []) ] # Some tests we don't need to do for each type. @pytest.mark.parametrize( 'testfunction', [ 'testSetGeoTransform', 'testSetProjection', # SetMetadata() not supported # 'testSetMetadata' ] ) @pytest.mark.require_driver('netcdf') def test_netcdf_functions_1(testfunction): ut = gdaltest.GDALTest('netcdf', 'byte.tif', 1, 4672, options=["GEOMETRY_ENCODING=WKT"]) getattr(ut, testfunction)() # Others we do for each pixel type. @pytest.mark.parametrize( 'filename,checksum,options', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.parametrize( 'testfunction', [ 'testCreateCopy', 'testCreate', 'testSetNoDataValue' ] ) @pytest.mark.require_driver('netcdf') def test_netcdf_functions_2(filename, checksum, options, testfunction): ut = gdaltest.GDALTest('netcdf', filename, 1, checksum, options=options) getattr(ut, testfunction)() ############################################################################### # simple geometry tests # basic tests def test_bad_cf1_8(): # basic resilience test, make sure it can exit "gracefully" # if not it will abort all tests bad_geometry = ogr.Open("data/netcdf-sg/no_geometry_type.nc") bad_feature = ogr.Open("data/netcdf-sg/bad_feature_test.nc") missing_node_counts_test = ogr.Open("data/netcdf-sg/missing_node_counts_test.nc") uneq_x_y = ogr.Open("data/netcdf-sg/unequal_xy.nc") corrupt_poly_1 = ogr.Open("data/netcdf-sg/corrupted_polygon_ncpncir.nc") corrupt_poly_2 = ogr.Open("data/netcdf-sg/corrupted_polygon_pnc.nc") corrupt_poly_3 = ogr.Open("data/netcdf-sg/corrupted_polygon_ir.nc") # error IS fatal assert(bad_geometry is None) assert(bad_feature is None) assert(missing_node_counts_test is None) assert(corrupt_poly_1 is None) assert(corrupt_poly_2 is None) assert(corrupt_poly_3 is None) assert(uneq_x_y is None) def test_point_read(): if gdaltest.netcdf_drv is None: pytest.skip() singleton_pt = ogr.Open("data/netcdf-sg/point_test.nc") lc = singleton_pt.GetLayerCount() assert(lc == 1) layer = singleton_pt.GetLayerByName("names_geometry") assert(layer != None) # Test each geometry directly ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (1 -1)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (2 -2)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (3 -3)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (4 -4)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (5 -5)") def test_point3D_read(): if gdaltest.netcdf_drv is None: pytest.skip() singleton_pt = ogr.Open("data/netcdf-sg/point3D_test.nc") lc = singleton_pt.GetLayerCount() assert(lc == 1) layer = singleton_pt.GetLayerByName("names_geometry") assert(layer != None) # Test each geometry directly ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (1 -1 1)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (2 -2 -2)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (3 -3 3)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (4 -4 -4)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POINT (5 -5 5)") def test_multipoint_read(): if gdaltest.netcdf_drv is None: pytest.skip() multipoints = ogr.Open("data/netcdf-sg/multipoint_test.nc") assert(multipoints != None) lc = multipoints.GetLayerCount() assert(lc == 1) layer = multipoints.GetLayerByName("names_geometry") assert(layer != None) ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (1 -1,2 -2,3 -3,4 -4)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (5 -5,6 -6,7 -7,8 -8)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (9 -9,10 -10,-1 1,-2 2)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (-3 3,-4 4,-5 5,-6 6)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (-7 7,-8 8,-9 9,-10 10)") def test_multipoint3D_read(): if gdaltest.netcdf_drv is None: pytest.skip() multipoints = ogr.Open("data/netcdf-sg/multipoint3D_test.nc") assert(multipoints != None) lc = multipoints.GetLayerCount() assert(lc == 1) layer = multipoints.GetLayerByName("names_geometry") assert(layer != None) ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (1 -1 1,2 -2 -2,3 -3 3,4 -4 -4)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (5 -5 5,6 -6 -6,7 -7 7,8 -8 -8)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (9 -9 9,10 -10 -10,-1 1 -1,-2 2 2)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (-3 3 -3,-4 4 4,-5 5 -5,-6 6 6)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (-7 7 -7,-8 8 8,-9 9 -9,-10 10 10)") def test_line_read(): if gdaltest.netcdf_drv is None: pytest.skip() line = ogr.Open("data/netcdf-sg/line_test.nc") assert(line != None) lc = line.GetLayerCount() assert(lc == 1) layer = line.GetLayerByName("names_geometry") assert(layer != None) ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (1 -1,2 -2,3 -3,4 -4)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (5 -5,6 -6,7 -7,8 -8)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (9 -9,10 -10,-1 1,-2 2)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (-3 3,-4 4,-5 5,-6 6)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (-7 7,-8 8,-9 9,-10 10)") def test_line3D_read(): if gdaltest.netcdf_drv is None: pytest.skip() line = ogr.Open("data/netcdf-sg/line3D_test.nc") assert(line != None) lc = line.GetLayerCount() assert(lc == 1) layer = line.GetLayerByName("names_geometry") assert(layer != None) ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (1 -1 1,2 -2 -2,3 -3 3,4 -4 -4)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (5 -5 5,6 -6 -6,7 -7 7,8 -8 -8)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (9 -9 9,10 -10 -10,-1 1 1,-2 2 -2)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (-3 3 3,-4 4 -4,-5 5 5,-6 6 -6)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "LINESTRING (-7 7 7,-8 8 -8,-9 9 9,-10 10 -10)") def test_multiline_read(): if gdaltest.netcdf_drv is None: pytest.skip() multiline = ogr.Open("data/netcdf-sg/multiline_test.nc") assert(multiline != None) lc = multiline.GetLayerCount() assert(lc == 1) layer = multiline.GetLayerByName("names_geometry") assert(layer != None) ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((1 -1),(2 -2,3 -3,4 -4))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((5 -5,6 -6,7 -7,8 -8))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((9 -9,10 -10,-1 1),(-2 2))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((-3 3,-4 4),(-5 5,-6 6))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((-7 7,-8 8,-9 9,-10 10))") def test_multiline3D_read(): if gdaltest.netcdf_drv is None: pytest.skip() multiline = ogr.Open("data/netcdf-sg/multiline3D_test.nc") assert(multiline != None) lc = multiline.GetLayerCount() assert(lc == 1) layer = multiline.GetLayerByName("names_geometry") assert(layer != None) ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((1 -1 -1),(2 -2 2,3 -3 -3,4 -4 4))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((5 -5 -5,6 -6 6,7 -7 -7,8 -8 8))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((9 -9 -9,10 -10 10,-1 1 -1),(-2 2 2))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((-3 3 -3,-4 4 4),(-5 5 -5,-6 6 6))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTILINESTRING ((-7 7 -7,-8 8 8,-9 9 -9,-10 10 10))") def test_polygon_read(): if gdaltest.netcdf_drv is None: pytest.skip() polygon = ogr.Open("data/netcdf-sg/polygon_test.nc") assert(polygon != None) lc = polygon.GetLayerCount() assert(lc == 1) layer = polygon.GetLayerByName("names_geometry") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POLYGON ((0 0,1 0,1 1,0 0))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POLYGON ((3 0,4 0,4 1,3 1,3 0))") def test_polygon3D_read(): if gdaltest.netcdf_drv is None: pytest.skip() polygon = ogr.Open("data/netcdf-sg/polygon3D_test.nc") assert(polygon != None) lc = polygon.GetLayerCount() assert(lc == 1) layer = polygon.GetLayerByName("names_geometry") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POLYGON ((0 0 1,1 0 2,1 1 2,0 0 1))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POLYGON ((3 0 1,4 0 1,4 1 1,3 1 1,3 0 1))") def test_multipolygon_read(): if gdaltest.netcdf_drv is None: pytest.skip() multipolygon = ogr.Open("data/netcdf-sg/multipolygon_test.nc") assert(multipolygon != None) lc = multipolygon.GetLayerCount() assert(lc == 1) layer = multipolygon.GetLayerByName("names_geometry") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))") def test_multipolygon3D_read(): if gdaltest.netcdf_drv is None: pytest.skip() multipolygon = ogr.Open("data/netcdf-sg/multipolygon3D_test.nc") assert(multipolygon != None) lc = multipolygon.GetLayerCount() assert(lc == 1) layer = multipolygon.GetLayerByName("names_geometry") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOLYGON (((0 0 0,1 0 5,1 1 5,0 0 0)))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOLYGON (((3 0 5,4 0 10,4 1 10,3 0 5)),((3 0 10,4 1 15,3 1 15,3 0 10)))") def test_serpenski_two_ring(): if gdaltest.netcdf_drv is None: pytest.skip() s = ogr.Open("data/netcdf-sg/serpenski_2nd.nc") assert(s != None) lc = s.GetLayerCount() assert(lc == 1) good_layer = s.GetLayerByName("serpenski") assert(good_layer != None) # real layer assert(good_layer.GetFeatureCount() == 1) assert(good_layer.GetGeomType() == ogr.wkbMultiPolygon) serpenski = good_layer.GetNextFeature() triangle = serpenski.GetGeometryRef() st_wkt = triangle.ExportToWkt() assert(st_wkt == \ "MULTIPOLYGON (((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219,0.25 0.433012701892219,0.5 0.0)))") def test_serpenski3D_two_ring(): if gdaltest.netcdf_drv is None: pytest.skip() s = ogr.Open("data/netcdf-sg/serpenski3D_2nd.nc") assert(s != None) lc = s.GetLayerCount() assert(lc == 1) good_layer = s.GetLayerByName("serpenski") assert(good_layer != None) # real layer assert(good_layer.GetFeatureCount() == 1) assert(good_layer.GetGeomType() == ogr.wkbMultiPolygon25D) serpenski = good_layer.GetNextFeature() triangle = serpenski.GetGeometryRef() st_wkt = triangle.ExportToWkt() assert(st_wkt == \ "MULTIPOLYGON (((0 0 1,1 0 1,0.5 0.866025403784439 1,0 0 1),(0.5 0.0 1,0.75 0.433012701892219 1,0.25 0.433012701892219 1,0.5 0.0 1)))") def test_flipped_axis(): if gdaltest.netcdf_drv is None: pytest.skip() # similar to simple polygon test, but with flipped axis polygon = ogr.Open("data/netcdf-sg/flipped_axes_test.nc") assert(polygon != None) layer = polygon.GetLayerByName("names_geometry") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POLYGON ((0 0,1 0,1 1,0 0))") def test_arbitrary_3Daxis_order_(): if gdaltest.netcdf_drv is None: pytest.skip() polygon = ogr.Open("data/netcdf-sg/arbitrary_axis_order_test.nc") assert(polygon != None) layer = polygon.GetLayerByName("names_geometry") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POLYGON ((0 0 1,1 0 2,1 1 2,0 0 1))") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "POLYGON ((3 0 1,4 0 1,4 1 1,3 1 1,3 0 1))") def test_multiple_layers_one_nc(): if gdaltest.netcdf_drv is None: pytest.skip() # tests whether or not an NC with multiple geometry containers can be read # each geometry container a layer s = ogr.Open("data/netcdf-sg/multiple_containers.nc") lc = s.GetLayerCount() assert(lc == 2) s_triangle = s.GetLayerByName("serpenski") s_outline = s.GetLayerByName("serpenski_outline") assert(s_triangle != None) assert(s_outline != None) triangle_ft = s_triangle.GetNextFeature() triangle = triangle_ft.GetGeometryRef() assert(triangle.GetGeometryType() == ogr.wkbMultiPolygon) st_wkt = triangle.ExportToWkt() assert(st_wkt == \ "MULTIPOLYGON (((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219,0.25 0.433012701892219,0.5 0.0)))") outline_ft = s_outline.GetNextFeature() outline = outline_ft.GetGeometryRef() assert(outline.GetGeometryType() == ogr.wkbMultiLineString) so_wkt = outline.ExportToWkt() assert(so_wkt == \ "MULTILINESTRING ((0 0,1 0,0.5 0.866025403784439,0 0),(0.5 0.0,0.75 0.433012701892219,0.25 0.433012701892219,0.5 0.0))") # advanced tests def test_yahara(): if gdaltest.netcdf_drv is None: pytest.skip() yahara = ogr.Open("data/netcdf-sg/Yahara_alb.nc") assert(yahara != None) y_layer = yahara.GetLayerByName("geometry_container") assert(y_layer != None) # Assert some basic properties assert(y_layer.GetFeatureCount() == 71) assert(y_layer.GetGeomType() == ogr.wkbMultiPolygon) # Test getting a single feature through iteration first = y_layer.GetNextFeature() # Check fields are set correctly assert(first.GetFieldAsInteger("ID") == 1) assert(first.GetFieldAsInteger("GRIDCODE") == 55) assert(first.GetFieldAsDouble("X_COORD") == 577251.43302) assert(first.GetFieldAsDouble("Y_COORD") == 319799.04918) # Check spatial ref is set correctly fSRS = y_layer.GetSpatialRef() assert(fSRS is not None) assert(fSRS.ExportToWkt() == "PROJCS[\"unnamed\",GEOGCS[\"unknown\",DATUM[\"unnamed\",SPHEROID[\"Spheroid\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]]],PROJECTION[\"Albers_Conic_Equal_Area\"],PARAMETER[\"latitude_of_center\",23],PARAMETER[\"longitude_of_center\",-96],PARAMETER[\"standard_parallel_1\",29.5],PARAMETER[\"standard_parallel_2\",45.5],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]]") def test_states_full_layer(): if gdaltest.netcdf_drv is None: pytest.skip() states = ogr.Open("data/netcdf-sg/cf1.8_states.nc") assert(states != None) s_layer = states.GetLayerByName("geometry_container") assert(s_layer != None) # Assert some basic properties (again) assert(s_layer.GetFeatureCount() == 49) assert(s_layer.GetGeomType() == ogr.wkbMultiPolygon) # Test getting two features first = s_layer.GetNextFeature() second = s_layer.GetNextFeature() # try resetting and then trying again s_layer.ResetReading() first_2 = s_layer.GetNextFeature() # Did reset work correctly? assert(first.Equal(first_2)) # Sanity check assert(first.Equal(second) != True) # Check fields are set correctly assert(second.GetFieldAsString("STATE_NAME") == "Montana") assert(second.GetFieldAsInteger("DRAWSEQ") == 3) assert(second.GetFieldAsString("STATE_FIPS") == "30") assert(second.GetFieldAsString("STATE_ABBR") == "MT") ############################################################################### # simple geometry writing tests def test_point_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/point_write_test.json", gdal.OF_VECTOR) assert(src is not None) gdal.VectorTranslate("tmp/test_point_write.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/test_point_write.nc") assert(src is not None) assert(src.GetLayerCount() == 1) # Test layer properties layer = nc_tsrc.GetLayerByName("point_collection") assert(layer is not None) assert(layer.GetFeatureCount() == 4) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (0.5 -0.5)") assert(fnam == "FishingSpot1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1 -1)") assert(fnam == "FishingSpot2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1.5 -1.5)") assert(fnam == "FishingSpot3") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (2 -2)") assert(fnam == "FishingSpot4") def test_point3D_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/point3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) gdal.VectorTranslate("tmp/test_point3D_write.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/test_point3D_write.nc") assert(src is not None) assert(src.GetLayerCount() == 1) # Test layer properties layer = nc_tsrc.GetLayerByName("point_collection") assert(layer is not None) assert(layer.GetFeatureCount() == 4) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (0.5 -0.5 -1.5)") assert(fnam == "FishingSpot1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1 -1 -0.5)") assert(fnam == "FishingSpot2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1.5 -1.5 0.5)") assert(fnam == "FishingSpot3") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (2 -2 1.5)") assert(fnam == "FishingSpot4") def test_line_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/line_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/line_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/line_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("segv") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "LINESTRING (1.5 -1.5)") assert(fnam == "seg1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "LINESTRING (30.5 30.5,5 5)") assert(fnam == "seg2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "LINESTRING (9 -9,10 -10,-1 1)") assert(fnam == "seg3") def test_line3D_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/line3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/line3D_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/line3D_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("path") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "LINESTRING (0.1 0.2 0.3,99 -99 0)") assert(fnam == "path1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "LINESTRING (100 101 102,25 27 29)") assert(fnam == "path2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "LINESTRING (7 -11 -7,-11 7 11,-6 1945 1918)") assert(fnam == "path3") def test_polygon_no_ir_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon_no_ir_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/polygon_no_ir_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/polygon_no_ir_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("noir_write") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually # Do to ambiguities present in CF-1.8, these are actually read out as Multipolygons, not Polygons # But when being written out, they are OGRFeature POLYGON feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POLYGON ((0 0,1 0,1 1,0 0))") assert(fnam == "Triangle") # This second feature has an interior ring in it feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POLYGON ((3 0,4 0,4 1,3 1,3 0))") assert(fnam == "Square") def test_polygon_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/polygon_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/polygon_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("shapes") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually # Do to ambiguities present in CF-1.8, these are actually read out as Multipolygons, not Polygons # But when being written out, they are OGRFeature POLYGON feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)))") assert(fnam == "Triangle") # This second feature has an interior ring in it feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 1,3 0),(3.5 0.25,3.75 0.25,3.75 0.5,3.5 0.5,3.5 0.25)))") assert(fnam == "Square_in_Square") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,-1 0,-1 -1,0 0)))") assert(fnam == "Triangle_Flipped") def test_polygon3D_no_ir_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon3D_no_ir_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/polygon3D_no_ir_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/polygon3D_no_ir_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("noir_write") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually # Do to ambiguities present in CF-1.8, these are actually read out as Multipolygons, not Polygons # But when being written out, they are OGRFeature POLYGON feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fid = feat.GetFieldAsInteger("ID") assert(fWkt == "POLYGON ((0 0 0,1 0 2,1 1 0,0 0 2))") assert(fid == 0) # This second feature has an interior ring in it feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fid = feat.GetFieldAsInteger("ID") assert(fWkt == "POLYGON ((3 0 -1,4 0 -2,4 1 0,3 1 -2,3 0 -1))") assert(fid == 1) def test_polygon3D_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/polygon3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/polygon3D_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/polygon3D_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("shapes") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually # Do to ambiguities present in CF-1.8, these are actually read out as Multipolygons, not Polygons # But when being written out, they are OGRFeature POLYGON feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0 0,1 0 -1,1 1 -2,0 0 -3)))") assert(fnam == "Trianglything") # This second feature has an interior ring in it feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 1,3.75 0.25 1,3.75 0.5 1,3.5 0.5 1,3.5 0.25 1)))") assert(fnam == "Prismthing") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0 0,-1 0 1,-1 -1 2,0 0 3)))") assert(fnam == "Trianglyflipped") def test_multipoint_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multipoint_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipoint_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multipoint_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("peak_list") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOINT (1 -1,2 -2,4 -4)") assert(fnam == "Peaks1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOINT (5 -5,6 -6,8 -8)") assert(fnam == "Peaks2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOINT (9 -9,10 -10,-2 2)") assert(fnam == "Peaks3") def test_multipoint3D_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multipoint3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipoint3D_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multipoint3D_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("drilling_sites") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOINT (0 -1 -5,2 -2 2)") assert(fnam == "site1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOINT (7 -2 1,4 3 2,8 -8 3)") assert(fnam == "site2") def test_multiline_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multiline_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multiline_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multiline_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("streams") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTILINESTRING ((1 -5),(2 -4,3 -3,4 -2,5 -1))") assert(fnam == "fresh_river") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTILINESTRING ((-2 5,-3 4,-4 3,-5 2))") assert(fnam == "not_so_fresh_river") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTILINESTRING ((0 1,1 0),(2 0,-2 0))") assert(fnam == "not_fresh_river") def test_multiline3D_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multiline3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multiline3D_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multiline3D_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("streams") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTILINESTRING ((1 -5 10),(2 -4 9,3 -3 8,4 -2 7,5 -1 8))") assert(fnam == "fresh_river") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTILINESTRING ((0 1 1,1 0 2),(2 0 1,-2 0 1))") assert(fnam == "not_fresh_river") def test_multipolygon_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipolygon_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multipolygon_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("shapes") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually # Do to ambiguities present in CF-1.8, these are actually read out as Multipolygons, not Polygons # But when being written out, they are OGRFeature POLYGON feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)),((0 0,-1 0,-1 -1,0 0)))") assert(fnam == "Triangles") # This second feature has an interior ring in it feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 1,3 0),(3.5 0.25,3.75 0.25,3.75 0.5,3.5 0.5,3.5 0.25)),((4 4,4 5,5 4,4 4)))") assert(fnam == "Square_in_Square_and_Triangle") def test_multipolygon3D_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipolygon3D_write_test.nc4", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multipolygon3D_write_test.nc4") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("shapes") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually # Due to ambiguities present in CF-1.8, these are actually read out as Multipolygons, not Polygons # But when being written out, they are OGRFeature POLYGON feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0 0,1 0 1,1 1 1,0 0 0)),((0 0 0,-1 0 -1,-1 -1 -1,0 0 0)))") assert(fnam == "Trianglies") # This second feature has an interior ring in it feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 0,3.75 0.25 0,3.75 0.5 0.1,3.5 0.5 0.1,3.5 0.25 0)),((4 4 100,4 5 101,5 4 101,4 4 100)))") assert(fnam == "Prismy_and_Triangly") # This third feature is just a Polygon feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((-2 0 -5,-2 1 -6,-1 1 -6,-2 0 -5)))") assert(fnam == "Single_Triangly") def test_multipolygon_with_no_ir_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipolygon_no_ir_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multipolygon_no_ir_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("mpoly_shape") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)))") assert(fnam == "Triangle") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))") assert(fnam == "DoubleTriangle") def test_multipolygon3D_with_no_ir_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon3D_no_ir_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipolygon3D_no_ir_write_test.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/multipolygon3D_no_ir_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("mpoly_shape") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0 0,1 0 1,1 1 2,0 0 3)))") assert(fnam == "Triangle") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0 0,4 0 1,4 1 2,3 0 3)),((3 0 -1,4 1 -2,3 1 -3,3 0 -4)))") assert(fnam == "DoubleTriangle") def test_write_buffer_restrict_correctness(): if gdaltest.netcdf_drv is None: pytest.skip() # Tests whether or not having the write buffer restriction # Writes correct data. src = gdal.OpenEx("data/netcdf-sg/write-tests/Yahara_alb.json") assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/Yahara_alb_4K_restrict.nc", src, format="netCDF", layerCreationOptions = ['BUFFER_SIZE=4096']) gdal.VectorTranslate("tmp/Yahara_alb_default_buf.nc", src, format="netCDF") fk_ds = ogr.Open("tmp/Yahara_alb_4K_restrict.nc") db_ds = ogr.Open("tmp/Yahara_alb_default_buf.nc") fk_ds_layer = fk_ds.GetLayerByName("geometry_container") db_ds_layer = db_ds.GetLayerByName("geometry_container") assert(fk_ds_layer is not None) assert(db_ds_layer is not None) for feat in range(71): lft = fk_ds_layer.GetNextFeature() dft = db_ds_layer.GetNextFeature() lftgeo = lft.GetGeometryRef() dftgeo = dft.GetGeometryRef() assert(lftgeo.Equal(dftgeo)) def test_write_nc_from_nc(): if gdaltest.netcdf_drv is None: pytest.skip() # Tests writing a netCDF file (of different name than source) out from another netCDF source file src = gdal.OpenEx("data/netcdf-sg/multipoint_test.nc", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipoint_test_replica.nc", src, format="netCDF") ncds = ogr.Open("tmp/multipoint_test_replica.nc") assert(src is not None) layer = ncds.GetLayerByName("names_geometry") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (1 -1,2 -2,3 -3,4 -4)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (5 -5,6 -6,7 -7,8 -8)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (9 -9,10 -10,-1 1,-2 2)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (-3 3,-4 4,-5 5,-6 6)") ft = layer.GetNextFeature() ft_geo = ft.GetGeometryRef() ft_wkt = ft_geo.ExportToWkt() assert(ft_wkt == "MULTIPOINT (-7 7,-8 8,-9 9,-10 10)") def test_multipolygon_with_no_ir_NC4_write(): if gdaltest.netcdf_drv is None: pytest.skip() # Almost identical to test_multipolygon_with_no_ir # except this time, it is writing an NC4 file src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/multipolygon_no_ir_write_test.nc4", src, format="netCDF", datasetCreationOptions=['FORMAT=NC4']) nc_tsrc = ogr.Open("tmp/multipolygon_no_ir_write_test.nc4") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("mpoly_shape") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)))") assert(fnam == "Triangle") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))") assert(fnam == "DoubleTriangle") def test_multipolygon3D_NC4C_write(): if gdaltest.netcdf_drv is None: pytest.skip() src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) # This test is identical to test_multipolygon3D_write # except it writes to NC4C gdal.VectorTranslate("tmp/multipolygon3D_write_test.nc", src, format="netCDF", datasetCreationOptions=['FORMAT=NC4C']) nc_tsrc = ogr.Open("tmp/multipolygon3D_write_test.nc") assert(src is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("shapes") assert(layer is not None) assert(layer.GetFeatureCount() == 3) # Test each feature manually # Due to ambiguities present in CF-1.8, these are actually read out as Multipolygons, not Polygons # But when being written out, they are OGRFeature POLYGON feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0 0,1 0 1,1 1 1,0 0 0)),((0 0 0,-1 0 -1,-1 -1 -1,0 0 0)))") assert(fnam == "Trianglies") # This second feature has an interior ring in it feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0 0,4 0 0,4 1 1,3 1 1,3 0 0),(3.5 0.25 0,3.75 0.25 0,3.75 0.5 0.1,3.5 0.5 0.1,3.5 0.25 0)),((4 4 100,4 5 101,5 4 101,4 4 100)))") assert(fnam == "Prismy_and_Triangly") # This third feature is just a Polygon feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((-2 0 -5,-2 1 -6,-1 1 -6,-2 0 -5)))") assert(fnam == "Single_Triangly") def test_netcdf_dimension_labels_with_null(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() # Crashes with 4.1.3 of Ubuntu Precise if gdaltest.netcdf_drv_version.startswith('4.0.') or gdaltest.netcdf_drv_version.startswith('4.1.'): pytest.skip('Test crashes with this libnetcdf version') with gdaltest.error_handler(): assert gdal.Open('data/netcdf/dimension_labels_with_null.nc') def test_write_multiple_layers_one_nc(): if gdaltest.netcdf_drv is None: pytest.skip() # tests writing multiple layers in NC3 # each geometry container a layer # this also tests "update mode" for CF-1.8 src = gdal.OpenEx("data/netcdf-sg/write-tests/multipolygon_no_ir_write_test.json", gdal.OF_VECTOR) assert(src is not None) gdal.VectorTranslate("tmp/mlnc.nc", src, format="netCDF") src = gdal.OpenEx("data/netcdf-sg/write-tests/point3D_write_test.json", gdal.OF_VECTOR) assert(src is not None) gdal.VectorTranslate("tmp/mlnc.nc", src, format="netCDF", accessMode='update') nc_tsrc = ogr.Open("tmp/mlnc.nc") assert(nc_tsrc.GetLayerCount() == 2) # Test layer properties layer = nc_tsrc.GetLayerByName("mpoly_shape") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)))") assert(fnam == "Triangle") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))") assert(fnam == "DoubleTriangle") # Test layer properties layer = nc_tsrc.GetLayerByName("point_collection") assert(layer is not None) assert(layer.GetFeatureCount() == 4) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (0.5 -0.5 -1.5)") assert(fnam == "FishingSpot1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1 -1 -0.5)") assert(fnam == "FishingSpot2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1.5 -1.5 0.5)") assert(fnam == "FishingSpot3") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (2 -2 1.5)") assert(fnam == "FishingSpot4") def test_write_multiple_layers_one_nc_NC4(): if gdaltest.netcdf_drv is None: pytest.skip() # nearly identical to previous test except that # it writes to NC4, not NC3 (changing a file from NC3 to NC4) # and it writes them all at once (non update) src = gdal.OpenEx("tmp/mlnc.nc", gdal.OF_VECTOR) assert(src is not None) gdal.VectorTranslate("tmp/mlnc4.nc4", src, format="netCDF", datasetCreationOptions=['FORMAT=NC4']) nc_tsrc = ogr.Open("tmp/mlnc4.nc4") assert(nc_tsrc.GetLayerCount() == 2) # Test layer properties layer = nc_tsrc.GetLayerByName("mpoly_shape") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)))") assert(fnam == "Triangle") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))") assert(fnam == "DoubleTriangle") # Test layer properties layer = nc_tsrc.GetLayerByName("point_collection") assert(layer is not None) assert(layer.GetFeatureCount() == 4) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (0.5 -0.5 -1.5)") assert(fnam == "FishingSpot1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1 -1 -0.5)") assert(fnam == "FishingSpot2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1.5 -1.5 0.5)") assert(fnam == "FishingSpot3") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (2 -2 1.5)") assert(fnam == "FishingSpot4") def test_write_multiple_layers_one_nc_back_to_NC3(): if gdaltest.netcdf_drv is None: pytest.skip() # nearly identical to previous test except that # it writes to from NC4 to NC3 # and it writes them all at once (non update) # test_write_multiple_layers_one_nc writes one and then another in update mode src = gdal.OpenEx("tmp/mlnc4.nc4", gdal.OF_VECTOR) assert(src is not None) gdal.VectorTranslate("tmp/mlnc_noupdate3.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/mlnc_noupdate3.nc") assert(nc_tsrc.GetLayerCount() == 2) # Test layer properties layer = nc_tsrc.GetLayerByName("mpoly_shape") assert(layer is not None) assert(layer.GetFeatureCount() == 2) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((0 0,1 0,1 1,0 0)))") assert(fnam == "Triangle") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "MULTIPOLYGON (((3 0,4 0,4 1,3 0)),((3 0,4 1,3 1,3 0)))") assert(fnam == "DoubleTriangle") # Test layer properties layer = nc_tsrc.GetLayerByName("point_collection") assert(layer is not None) assert(layer.GetFeatureCount() == 4) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (0.5 -0.5 -1.5)") assert(fnam == "FishingSpot1") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1 -1 -0.5)") assert(fnam == "FishingSpot2") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (1.5 -1.5 0.5)") assert(fnam == "FishingSpot3") feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") assert(fWkt == "POINT (2 -2 1.5)") assert(fnam == "FishingSpot4") def test_SG_NC3_field_write(): # Tests all the NC3 field writing capabilities with # buffering. src = gdal.OpenEx("data/netcdf-sg/write-tests/field_test_nc3.nc", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/bufft.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/bufft.nc") assert(nc_tsrc is not None) # Test layer properties layer = nc_tsrc.GetLayerByName("names_geometry") assert(layer is not None) assert(layer.GetFeatureCount() == 1) # Test each feature manually feat = layer.GetNextFeature() fgeo = feat.GetGeometryRef() fWkt = fgeo.ExportToWkt() fnam = feat.GetFieldAsString("NAMES") fid = feat.GetFieldAsInteger("IDS") fnum1 = feat.GetFieldAsInteger("NUM_1") fnum2 = feat.GetFieldAsInteger("NUM_2") fflt = feat.GetFieldAsDouble("FL") fdbl = feat.GetFieldAsDouble("DBL") assert(fWkt == "POINT (1 -1)") assert(fnam == "Guage_1") assert(fid == 0) assert(fnum1 == 1) assert(fnum2 == 2) assert(fflt == 1.5) assert(fdbl == 99.5) def test_states_full_layer_buffer_restrict_correctness(): # Tests whether or not having the write buffer restriction # Writes correct data. # Note: this is different than the Yahara version in that it also tests # Correctness of writing buffered NC_CHARs and NC_STRINGs (NC4) src = gdal.OpenEx("data/netcdf-sg/write-tests/cf1.8_states.json") assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/states_4K_restrict.nc", src, format="netCDF", layerCreationOptions = ['BUFFER_SIZE=4096']) gdal.VectorTranslate("tmp/states_default_buf.nc", src, format="netCDF") fk_ds = ogr.Open("tmp/states_4K_restrict.nc") db_ds = ogr.Open("tmp/states_default_buf.nc") fk_ds_layer = fk_ds.GetLayerByName("geometry_container") db_ds_layer = db_ds.GetLayerByName("geometry_container") assert(fk_ds_layer is not None) assert(db_ds_layer is not None) for feat in range(49): lft = fk_ds_layer.GetNextFeature() dft = db_ds_layer.GetNextFeature() lftgeo = lft.GetGeometryRef() dftgeo = dft.GetGeometryRef() assert(lftgeo.Equal(dftgeo)) def test_empty_polygon_read_write(): # Tests writing features to a layer of empty polygons src = gdal.OpenEx("data/netcdf-sg/write-tests/empty_polygon_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/empty_polygon.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/empty_polygon.nc") assert(nc_tsrc is not None) nc_layer = nc_tsrc.GetLayerByName("places") assert(nc_layer.GetFeatureCount() == 2) first = nc_layer.GetNextFeature() assert(first.GetFieldAsString("NAMES") == "Somewhere") assert(first.GetGeometryRef().ExportToWkt() == "POLYGON ((0 1,1 0,2 0,0 1))") second = nc_layer.GetNextFeature() assert(second.GetFieldAsString("NAMES") == "Everywhere") assert(second.GetGeometryRef().IsEmpty()) def test_empty_multiline_read_write(): # Tests writing features to a layer of empty polygons src = gdal.OpenEx("data/netcdf-sg/write-tests/empty_mline_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/empty_mline.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/empty_mline.nc") assert(nc_tsrc is not None) nc_layer = nc_tsrc.GetLayerByName("places") assert(nc_layer.GetFeatureCount() == 2) first = nc_layer.GetNextFeature() assert(first.GetFieldAsString("NAMES") == "Somewhere") assert(first.GetGeometryRef().ExportToWkt() == "MULTILINESTRING ((0 5,2 0))") second = nc_layer.GetNextFeature() assert(second.GetFieldAsString("NAMES") == "Everywhere") assert(second.GetGeometryRef().IsEmpty()) def test_empty_multipolygon_read_write(): # Tests writing features to a layer of empty polygons src = gdal.OpenEx("data/netcdf-sg/write-tests/empty_multipolygon_write_test.json", gdal.OF_VECTOR) assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/empty_multipolygon.nc", src, format="netCDF") nc_tsrc = ogr.Open("tmp/empty_multipolygon.nc") assert(nc_tsrc is not None) nc_layer = nc_tsrc.GetLayerByName("places") assert(nc_layer.GetFeatureCount() == 2) first = nc_layer.GetNextFeature() assert(first.GetFieldAsString("NAMES") == "Nowhere") assert(first.GetGeometryRef().IsEmpty()) second = nc_layer.GetNextFeature() assert(second.GetFieldAsString("NAMES") == "Somewhere") assert(second.GetGeometryRef().ExportToWkt() == "MULTIPOLYGON (((0 0,2 0,2 2,0 2,0 0)))") def test_states_full_layer_buffer_restrict_correctness_single_datum(): # Single datum regression test src = gdal.OpenEx("data/netcdf-sg/write-tests/cf1.8_states.json") assert(src is not None) assert(src.GetLayerCount() == 1) gdal.VectorTranslate("tmp/states_4K_restrict_sd.nc", src, format="netCDF", layerCreationOptions = ['BUFFER_SIZE=4096', "GROUPLESS_WRITE_BACK=YES"]) fk_ds = ogr.Open("tmp/states_4K_restrict_sd.nc") db_ds = ogr.Open("tmp/states_4K_restrict.nc") fk_ds_layer = fk_ds.GetLayerByName("geometry_container") db_ds_layer = db_ds.GetLayerByName("geometry_container") assert(fk_ds_layer is not None) assert(db_ds_layer is not None) for feat in range(49): lft = fk_ds_layer.GetNextFeature() dft = db_ds_layer.GetNextFeature() lftgeo = lft.GetGeometryRef() dftgeo = dft.GetGeometryRef() assert(lftgeo.Equal(dftgeo)) def test_netcdf_uint16_netcdf4_without_fill(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() # This dataset was created with nc_def_var_fill(cdfid, nZId, NC_NOFILL, NULL) # Check that we don't report a nodata value ds = gdal.Open('data/netcdf/uint16_netcdf4_without_fill.nc') assert not ds.GetRasterBand(1).GetNoDataValue() def test_netcdf_sen3_sral_mwr_fake_standard_measurement(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ds = gdal.OpenEx('data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc', gdal.OF_RASTER) assert not ds ds = gdal.OpenEx('data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc', gdal.OF_VECTOR) assert ds assert ds.GetLayerCount() == 3 lyr = ds.GetLayer(0) assert lyr.GetName() == 'sen3_sral_mwr_fake_standard_measurement_time_01' assert lyr.GetSpatialRef() is not None assert lyr.GetLayerDefn().GetFieldCount() == 5 assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 assert lyr.TestCapability(ogr.OLCRandomRead) == 1 assert lyr.TestCapability(ogr.OLCRandomWrite) == 0 assert lyr.GetFeatureCount() == 2 assert lyr.GetMetadata_Dict() == { 'alt_01_comment': 'Altitude of satellite above the reference ellipsoid', 'alt_01_long_name': 'altitude of the satellite : 1 Hz', 'alt_01_standard_name': 'height_above_reference_ellipsoid', 'alt_01_units': 'm', 'orb_alt_rate_01_comment': 'The reference surface for the orbital altitude rate is the combined mean_sea_surface/geoid surface. It is used to compute the Doppler correction on the altimeter range', 'orb_alt_rate_01_long_name': 'orbital altitude rate : 1 Hz', 'orb_alt_rate_01_units': 'm/s', 'surf_type_01_flag_meanings': 'ocean_or_semi_enclosed_sea enclosed_sea_or_lake continental_ice land', 'surf_type_01_flag_values': '{0,1,2,3}', 'surf_type_01_long_name': 'surface type : 1 Hz', 'time_01_calendar': 'gregorian', 'time_01_long_name': 'UTC: 1 Hz', 'time_01_standard_name': 'time', 'time_01_units': 'seconds since 2000-01-01 00:00:00.0', 'total_electron_content_01_long_name': 'Altimeter-derived total electron content (TECU) : 1 Hz', 'total_electron_content_01_units': 'count' } assert lyr.GetMetadataItem('alt_01_units') == 'm' f = lyr.GetNextFeature() assert f.GetGeometryRef().GetX() == pytest.approx(2.234567, 1e-7) assert f.GetGeometryRef().GetY() == pytest.approx(49.234567, 1e-7) assert f['time_01'] == 1.25 assert not f.IsFieldSet("surf_type_01") assert not f.IsFieldSet("orb_alt_rate_01") assert not f.IsFieldSet("total_electron_content_01") f = lyr.GetNextFeature() assert f['time_01'] == 2.25 assert f['surf_type_01'] == 1 assert f['orb_alt_rate_01'] == 0.01 assert f['total_electron_content_01'] == 10000000000.0 assert lyr.GetNextFeature() is None assert lyr.GetNextFeature() is None lyr.ResetReading() assert lyr.GetNextFeature() is not None lyr.SetSpatialFilterRect(-50,-50,-50,-50) lyr.ResetReading() assert lyr.GetNextFeature() is None assert lyr.GetFeatureCount() == 0 lyr.SetSpatialFilter(None) lyr.SetAttributeFilter('0 = 1') lyr.ResetReading() assert lyr.GetNextFeature() is None assert lyr.GetFeature(0) is None assert lyr.GetFeature(1).GetFID() == 1 assert lyr.GetFeature(3) is None lyr = ds.GetLayer(1) assert lyr.GetName() == 'sen3_sral_mwr_fake_standard_measurement_time_20_ku' f = lyr.GetNextFeature() assert not f.IsFieldSet('nb_stack_20_ku') f = lyr.GetNextFeature() assert f['nb_stack_20_ku'] == 1 def test_netcdf_chunked_multiple(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ds = gdal.Open('data/netcdf/byte_chunked_multiple.nc') assert ds.GetRasterBand(1).GetBlockSize() == [10, 10] assert ds.GetRasterBand(1).Checksum() == 4672 def test_netcdf_chunked_not_multiple(): if not gdaltest.netcdf_drv_has_nc4: pytest.skip() ds = gdal.Open('data/netcdf/byte_chunked_not_multiple.nc') assert ds.GetRasterBand(1).GetBlockSize() == [15, 6] assert ds.GetRasterBand(1).Checksum() == 4672 def test_netcdf_create(): ds = gdaltest.netcdf_drv.Create('tmp/test_create.nc', 2, 2) ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) ds.GetRasterBand(1).WriteRaster(0, 0, 2, 2, b'ABCD') ds = None ds = gdal.Open('tmp/test_create.nc') assert ds.GetGeoTransform() == pytest.approx([2, 0.1, 0, 49, 0, -0.1], rel=1e-10) assert ds.GetRasterBand(1).ReadRaster() == b'ABCD' ds = None gdal.Unlink('tmp/test_create.nc') def test_netcdf_sg1_8_max_variable_with_max_width_string_field_no_warning(): gdal.VectorTranslate("tmp/poly.nc", "../ogr/data/poly.shp", format="netCDF") gdal.ErrorReset() # Check that opening in raster/vector mode doesn't emit warning ds = gdal.OpenEx("tmp/poly.nc") assert gdal.GetLastErrorType() == 0 assert ds assert ds.GetLayerCount() == 1 ds = None gdal.Unlink('tmp/poly.nc') ############################################################################### # Test opening a netCDF 4 file whose HDF5 signature is not at the beginning def test_netcdf_hdf5_signature_not_at_beginning(): if gdaltest.netcdf_drv is None: pytest.skip() if not gdaltest.netcdf_drv_has_nc4: pytest.skip() # Works at least with since netCDF 4.7 version = gdaltest.netcdf_drv_version.split('.') if int(version[0]) * 100 + int(version[1]) < 407: pytest.skip() ds = gdal.Open('data/netcdf/byte_hdf5_starting_at_offset_1024.nc') assert ds is not None def test_clean_tmp(): # [KEEP THIS AS THE LAST TEST] # i.e. please do not add any tests after this one. Put new ones above. # Not actually a test, just cleans up tmp... gdaltest.clean_tmp() pytest.skip() gdalautotest-3.2.2/gdrivers/gxf.py0000775000175000017500000000715614020414370015666 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: gxf.py 5624114b404db158acb92f1e91c7384d843a76a3 2020-05-10 14:54:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for NITF driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pytest from osgeo import gdal import gdaltest ############################################################################### # Test a small GXF sample def test_gxf_1(): tst = gdaltest.GDALTest('GXF', 'gxf/small.gxf', 1, 90) return tst.testOpen() ############################################################################### # Test an other GXF sample (with continuous line) def test_gxf_2(): tst = gdaltest.GDALTest('GXF', 'gxf/small2.gxf', 1, 65042) wkt = """PROJCS["NAD27 / Ohio North", GEOGCS["NAD27", DATUM["NAD27", SPHEROID["NAD27",6378206.4,294.978699815746]], PRIMEM["unnamed",0], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",40.4333333333], PARAMETER["standard_parallel_2",41.7], PARAMETER["latitude_of_origin",39.6666666667], PARAMETER["central_meridian",82.5], PARAMETER["false_easting",609601.22], UNIT["ftUS",0.3048006096012]]""" return tst.testOpen(check_prj=wkt) gxf_list = [ ('http://download.osgeo.org/gdal/data/gxf', 'SAMPLE.GXF', 24068, -1), ('http://download.osgeo.org/gdal/data/gxf', 'gxf_compressed.gxf', 20120, -1), ('http://download.osgeo.org/gdal/data/gxf', 'gxf_text.gxf', 20265, -1), ('http://download.osgeo.org/gdal/data/gxf', 'gxf_ul_r.gxf', 19930, -1), ('http://download.osgeo.org/gdal/data/gxf', 'latlong.gxf', 12243, -1), ('http://download.osgeo.org/gdal/data/gxf', 'spif83.gxf', 28752, -1), ] @pytest.mark.parametrize( 'downloadURL,fileName,checksum,download_size', gxf_list, ids=[tup[1] for tup in gxf_list], ) def test_gxf(downloadURL, fileName, checksum, download_size): if not gdaltest.download_file(downloadURL + '/' + fileName, fileName, download_size): pytest.skip() ds = gdal.Open('tmp/cache/' + fileName) assert ds.GetRasterBand(1).Checksum() == checksum, 'Bad checksum. Expected %d, got %d' % (checksum, ds.GetRasterBand(1).Checksum()) gdalautotest-3.2.2/gdrivers/isis.py0000775000175000017500000017550614020414370016056 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: isis.py c04e0ea92cfb521061e84b9c3ba75b0e30345ffd 2020-07-02 22:27:16 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test ISIS3 formats. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # Copyright (c) 2017, Hobu Inc # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import json import struct from osgeo import gdal from osgeo import osr import gdaltest import pytest ############################################################################### # Perform simple read test on isis3 detached dataset. def test_isis_1(): srs = """PROJCS["Equirectangular Mars", GEOGCS["GCS_Mars", DATUM["D_Mars", SPHEROID["Mars_localRadius",3394813.857978216,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Equirectangular"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",184.4129944], PARAMETER["standard_parallel_1",-15.1470003], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1]] """ gt = (-4766.96484375, 10.102499961853027, 0.0, -872623.625, 0.0, -10.102499961853027) tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Perform simple read test on isis3 detached dataset. def test_isis_2(): srs = """PROJCS["Equirectangular mars", GEOGCS["GCS_mars", DATUM["D_mars", SPHEROID["mars_localRadius",3388271.702979241,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Equirectangular"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",195.92], PARAMETER["standard_parallel_1",-38.88], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1]] """ gt = (653.132641495800044, 0.38, 0, -2298409.710162799805403, 0, -0.38) tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_unit_test.cub', 1, 42403) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Perform simple read test on isis3 detached dataset with GeoTIFF image file def test_isis_3(): srs = """PROJCS["Equirectangular Mars", GEOGCS["GCS_Mars", DATUM["D_Mars", SPHEROID["Mars_localRadius",3394813.857978216,0]], PRIMEM["Reference_Meridian",0], UNIT["degree",0.0174532925199433]], PROJECTION["Equirectangular"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",184.4129944], PARAMETER["standard_parallel_1",-15.1470003], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1]] """ gt = (-4766.96484375, 10.102499961853027, 0.0, -872623.625, 0.0, -10.102499961853027) tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_geotiff.lbl', 1, 9978) return tst.testOpen(check_prj=srs, check_gt=gt) # ISIS3 -> ISIS3 conversion def test_isis_4(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds.GetMetadataDomainList() == ['', 'json:ISIS3'] lbl = ds.GetMetadata_List('json:ISIS3')[0] # Couldn't be preserved, since points to dangling file assert 'OriginalLabel' not in lbl assert 'PositiveWest' not in lbl assert ds.GetRasterBand(1).GetMaskFlags() == 0 assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 12220 ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Preserve source Mapping group as well tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['USE_SRC_MAPPING=YES']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert 'PositiveWest' in lbl assert 'Planetographic' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Preserve source Mapping group, but with a few overrides tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['USE_SRC_MAPPING=YES', 'LONGITUDE_DIRECTION=PositiveEast', 'LATITUDE_TYPE=Planetocentric', 'TARGET_NAME=my_label']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert 'PositiveEast' in lbl assert 'Planetocentric' in lbl assert 'my_label' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Label+image creation + WRITE_BOUNDING_DEGREES=NO option def test_isis_5(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['USE_SRC_LABEL=NO', 'WRITE_BOUNDING_DEGREES=NO']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) assert gdal.VSIStatL('/vsimem/isis_tmp.cub') is None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert 'MinimumLongitude' not in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Detached label creation and COMMENT option def test_isis_6(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['DATA_LOCATION=EXTERNAL', 'USE_SRC_LABEL=NO', 'COMMENT=my comment']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) assert gdal.VSIStatL('/vsimem/isis_tmp.cub') is not None f = gdal.VSIFOpenL('/vsimem/isis_tmp.lbl', 'rb') content = gdal.VSIFReadL(1, 10000, f).decode('ASCII') gdal.VSIFCloseL(f) assert '#my comment' in content assert len(content) != 10000 ds = gdal.Open('/vsimem/isis_tmp.lbl', gdal.GA_Update) ds.GetRasterBand(1).Fill(0) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds.GetRasterBand(1).Checksum() == 0 ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Uncompressed GeoTIFF creation def test_isis_7(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['DATA_LOCATION=GEOTIFF', 'USE_SRC_LABEL=NO']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) assert gdal.VSIStatL('/vsimem/isis_tmp.tif') is not None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"Format":"BandSequential"' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Test GEOTIFF_AS_REGULAR_EXTERNAL = NO tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['DATA_LOCATION=GEOTIFF', 'GEOTIFF_AS_REGULAR_EXTERNAL=NO', 'USE_SRC_LABEL=NO']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) assert gdal.VSIStatL('/vsimem/isis_tmp.tif') is not None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"Format":"GeoTIFF"' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Compressed GeoTIFF creation def test_isis_8(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['DATA_LOCATION=GEOTIFF', 'USE_SRC_LABEL=NO', 'GEOTIFF_OPTIONS=COMPRESS=LZW']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) assert gdal.VSIStatL('/vsimem/isis_tmp.tif') is not None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"Format":"GeoTIFF"' in lbl ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl', gdal.GA_Update) ds.GetRasterBand(1).Fill(0) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds.GetRasterBand(1).Checksum() == 0 ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Tiled creation + EXTERNAL_FILENAME def test_isis_9(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['DATA_LOCATION=EXTERNAL', 'USE_SRC_LABEL=NO', 'TILED=YES', 'EXTERNAL_FILENAME=/vsimem/foo.bin']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) assert gdal.VSIStatL('/vsimem/foo.bin') is not None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert ('"Format":"Tile"' in lbl and '"TileSamples":256' in lbl and \ '"TileLines":256' in lbl) ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') assert gdal.VSIStatL('/vsimem/foo.bin') is None # Tiled creation + regular GeoTIFF + EXTERNAL_FILENAME def test_isis_10(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['USE_SRC_LABEL=NO', 'DATA_LOCATION=GEOTIFF', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=32', 'EXTERNAL_FILENAME=/vsimem/foo.tif']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) ds = gdal.Open('/vsimem/foo.tif') assert ds.GetRasterBand(1).GetBlockSize() == [16, 32] ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') assert gdal.VSIStatL('/vsimem/foo.tif') is None # Tiled creation + compressed GeoTIFF def test_isis_11(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978, options=['USE_SRC_LABEL=NO', 'DATA_LOCATION=GEOTIFF', 'TILED=YES', 'GEOTIFF_OPTIONS=COMPRESS=LZW']) tst.testCreateCopy(new_filename='/vsimem/isis_tmp.lbl', delete_copy=0) ds = gdal.Open('/vsimem/isis_tmp.tif') assert ds.GetRasterBand(1).GetBlockSize() == [256, 256] ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Multiband def test_isis_12(): src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3') ds = gdal.Open('/vsimem/isis_tmp.lbl') for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Multiband tiled def test_isis_13(): src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3', creationOptions=['TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=32']) ds = gdal.Open('/vsimem/isis_tmp.lbl') for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Multiband with uncompressed GeoTIFF def test_isis_14(): src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3', creationOptions=['DATA_LOCATION=GEOTIFF']) ds = gdal.Open('/vsimem/isis_tmp.lbl') for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Multiband with uncompressed tiled GeoTIFF def test_isis_15(): src_ds = gdal.Open('../gcore/data/stefan_full_rgba.tif') gdal.Translate('/vsimem/isis_tmp.lbl', src_ds, format='ISIS3', creationOptions=['DATA_LOCATION=GEOTIFF', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=32']) ds = gdal.Open('/vsimem/isis_tmp.lbl') for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, (i + 1, cs, expected_cs) ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Test Create() without anything else def test_isis_16(): for read_before_write in [False, True]: for init_nd in [False, True]: for dt, cs, nd, options in [ [gdal.GDT_Byte, 0, 0, []], [gdal.GDT_Byte, 0, 0, ['TILED=YES']], [gdal.GDT_Byte, 0, 0, ['DATA_LOCATION=GEOTIFF', 'GEOTIFF_OPTIONS=COMPRESS=LZW']], [gdal.GDT_Int16, 65525, -32768, []], [gdal.GDT_UInt16, 0, 0, []], [gdal.GDT_Float32, 65534, -3.4028226550889045e+38, []] ]: ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 2, 1, dt, options=options) ds.GetRasterBand(1).SetOffset(10) ds.GetRasterBand(1).SetScale(20) if read_before_write: ds.GetRasterBand(1).ReadRaster() if init_nd: ds.GetRasterBand(1).Fill(nd) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds.GetRasterBand(1).Checksum() == cs, \ (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).Checksum()) assert ds.GetRasterBand(1).GetMaskFlags() == 0, \ (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetMaskFlags()) assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 0, \ (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetMaskBand().Checksum()) assert ds.GetRasterBand(1).GetOffset() == 10, \ (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetOffset()) assert ds.GetRasterBand(1).GetScale() == 20, \ (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetScale()) assert ds.GetRasterBand(1).GetNoDataValue() == nd, \ (dt, cs, nd, options, init_nd, ds.GetRasterBand(1).GetNoDataValue()) ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Test create copy through Create() def test_isis_17(): tst = gdaltest.GDALTest('ISIS3', 'isis3/isis3_detached.lbl', 1, 9978) return tst.testCreate(vsimem=1) # Test SRS serialization and deserialization def test_isis_18(): sr = osr.SpatialReference() sr.SetEquirectangular2(0, 1, 2, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Equirectangular DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_localRadius",123455.2424988797,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",1],PARAMETER["standard_parallel_1",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) sr = osr.SpatialReference() sr.SetEquirectangular2(123456, 1, 2, 987654, 3210123) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) gdal.PushErrorHandler() # Will warn that latitude_of_origin, false_easting and false_northing are ignored ds = None gdal.PopErrorHandler() ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Equirectangular DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_localRadius",123455.2424988797,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",1],PARAMETER["standard_parallel_1",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) sr = osr.SpatialReference() sr.SetOrthographic(1, 2, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Orthographic DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Orthographic"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) sr = osr.SpatialReference() sr.SetSinusoidal(1, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Sinusoidal DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Sinusoidal"],PARAMETER["longitude_of_center",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) sr = osr.SpatialReference() sr.SetMercator(0, 2, 0.9, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["Mercator DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')), wkt sr = osr.SpatialReference() sr.SetPS(1, 2, 0.9, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["PolarStereographic DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME_polarRadius",122838.72,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1],AXIS["Easting",SOUTH],AXIS["Northing",SOUTH]]')), wkt sr = osr.SpatialReference() sr.SetTM(1, 2, 0.9, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["TransverseMercator DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",1],PARAMETER["central_meridian",2],PARAMETER["scale_factor",0.9],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) sr = osr.SpatialReference() sr.SetLCC(1, 2, 3, 4, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') wkt = ds.GetProjectionRef() ds = None assert osr.SpatialReference(wkt).IsSame(osr.SpatialReference('PROJCS["LambertConformal DATUM_NAME",GEOGCS["GCS_DATUM_NAME",DATUM["D_DATUM_NAME",SPHEROID["DATUM_NAME",123456,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",1],PARAMETER["standard_parallel_2",2],PARAMETER["latitude_of_origin",3],PARAMETER["central_meridian",4],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1]]')) sr = osr.SpatialReference() sr.SetEquirectangular2(0, 1, 2, 0, 0) sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1, options=['LATITUDE_TYPE=Planetographic', 'TARGET_NAME=my_target', 'BOUNDING_DEGREES=1.5,2.5,3.5,4.5']) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([1000, 1, 0, 2000, 0, -1]) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"TargetName":"my_target"' in lbl assert '"LatitudeType":"Planetographic"' in lbl assert '"MinimumLatitude":2.5' in lbl assert '"MinimumLongitude":1.5' in lbl assert '"MaximumLatitude":4.5' in lbl assert '"MaximumLongitude":3.5' in lbl ds = None sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 100, 100, options=['LONGITUDE_DIRECTION=PositiveWest']) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([10, 1, 0, 40, 0, -1]) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"LongitudeDirection":"PositiveWest"' in lbl assert '"LongitudeDomain":180' in lbl assert '"MinimumLatitude":-60' in lbl assert '"MinimumLongitude":-110' in lbl assert '"MaximumLatitude":40' in lbl assert '"MaximumLongitude":-10' in lbl ds = None sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 123456, 200) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 100, 100, options=['FORCE_360=YES']) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([-10, 1, 0, 40, 0, -1]) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"MinimumLatitude":-60' in lbl assert '"MinimumLongitude":90' in lbl assert '"MaximumLatitude":40' in lbl assert '"MaximumLongitude":350' in lbl assert '"UpperLeftCornerX":-21547' in lbl assert '"UpperLeftCornerY":86188' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Test gdal.Info() with json:ISIS3 metadata domain def test_isis_19(): ds = gdal.Open('data/isis3/isis3_detached.lbl') res = gdal.Info(ds, format='json', extraMDDomains=['json:ISIS3']) assert res['metadata']['json:ISIS3']['IsisCube']['_type'] == 'object' ds = gdal.Open('data/isis3/isis3_detached.lbl') res = gdal.Info(ds, extraMDDomains=['json:ISIS3']) assert 'IsisCube' in res # Test gdal.Translate() subsetting and label preservation def test_isis_20(): with gdaltest.error_handler(): gdal.Translate('/vsimem/isis_tmp.lbl', 'data/isis3/isis3_detached.lbl', format='ISIS3', srcWin=[0, 0, 1, 1]) ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert 'AMadeUpValue' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Test gdal.Warp() and label preservation def test_isis_21(): with gdaltest.error_handler(): gdal.Warp('/vsimem/isis_tmp.lbl', 'data/isis3/isis3_detached.lbl', format='ISIS3') ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds.GetRasterBand(1).Checksum() == 9978 lbl = ds.GetMetadata_List('json:ISIS3')[0] assert 'AMadeUpValue' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Test source JSon use def test_isis_22(): ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) # Invalid Json js = """invalid""" with gdaltest.error_handler(): assert ds.SetMetadata([js], 'json:ISIS3') != 0 ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) # Invalid type for IsisCube js = """{ "IsisCube": 5 }""" ds.SetMetadata([js], 'json:ISIS3') lbl = ds.GetMetadata_List('json:ISIS3') assert lbl is not None ds.SetMetadata([js], 'json:ISIS3') ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds is not None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) # Invalid type for IsisCube.Core js = """{ "IsisCube": { "_type": "object", "Core": 5 } }""" ds.SetMetadata([js], 'json:ISIS3') ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds is not None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) # Invalid type for IsisCube.Core.Dimensions and IsisCube.Core.Pixels js = """{ "IsisCube": { "_type": "object", "Core": { "_type": "object", "Dimensions": 5, "Pixels": 5 } } }""" ds.SetMetadata([js], 'json:ISIS3') ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ds is not None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1, options=['DATA_LOCATION=EXTERNAL']) js = """{ "IsisCube": { "foo": "bar", "bar": [ 123, 124.0, 2.5, "xyz", "anotherveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylooooongtext", 234, 456, 789, 234, 567, 890, 123456789.0, 123456789.0, 123456789.0, 123456789.0, 123456789.0 ], "baz" : { "value": 5, "unit": "M" }, "baw": "with space", "very_long": "aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylooooongtext"} }""" ds.SetMetadata([js], 'json:ISIS3') ds = None f = gdal.VSIFOpenL('/vsimem/isis_tmp.lbl', 'rb') assert f is not None content = gdal.VSIFReadL(1, 10000, f).decode('ASCII') gdal.VSIFCloseL(f) assert ('foo = bar' in content and \ ' bar = (123, 124.0, 2.5, xyz' in content and \ ' anotherveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-' in content and \ ' eeeeeeeeeeeeeeeeeeeeeeeerylooooongtext, 234, 456, 789, 234, 567,' in content and \ ' 890, 123456789.0, 123456789.0, 123456789.0, 123456789.0,' in content and \ ' 123456789.0)' in content and \ 'baz = 5 ' in content and \ 'baw = "with space"' in content and \ 'very_long = aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-' in content) ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert ('"foo":"bar"' in lbl and '123' in lbl and \ '2.5' in lbl and 'xyz' in lbl and \ '"value":5' in lbl and '"unit":"M"' in lbl and \ '"baw":"with space"' in lbl and \ '"very_long":"aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylooooongtext"' in lbl) ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') # Test nodata remapping def test_isis_23(): mem_ds = gdal.Translate('', 'data/byte.tif', format='MEM') mem_ds.SetProjection('') mem_ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) mem_ds.GetRasterBand(1).SetNoDataValue(74) ref_data = mem_ds.GetRasterBand(1).ReadRaster() gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, format='ISIS3') ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, format='ISIS3', creationOptions=['DATA_LOCATION=GeoTIFF']) ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, format='ISIS3', creationOptions=['TILED=YES']) ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') for dt in [gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Float32]: mem_ds = gdal.Translate('', 'data/byte.tif', format='MEM', outputType=dt) mem_ds.SetProjection('') mem_ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) mem_ds.GetRasterBand(1).SetNoDataValue(74) ref_data = mem_ds.GetRasterBand(1).ReadRaster() gdal.Translate('/vsimem/isis_tmp.lbl', mem_ds, format='ISIS3') ds = gdal.Open('/vsimem/isis_tmp.lbl') assert ref_data != ds.GetRasterBand(1).ReadRaster() ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') def cancel_cbk(pct, msg, user_data): # pylint: disable=unused-argument return 0 # Test error cases def test_isis_24(): # For DATA_LOCATION=EXTERNAL, the main filename should have a .lbl extension with gdaltest.error_handler(): ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/error.txt', 1, 1, options=['DATA_LOCATION=EXTERNAL']) assert ds is None # cannot create external filename with gdaltest.error_handler(): ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/error.lbl', 1, 1, options=['DATA_LOCATION=EXTERNAL', 'EXTERNAL_FILENAME=/i_dont/exist/error.cub']) assert ds is None # no GTiff driver # with gdaltest.error_handler(): # gtiff_drv = gdal.GetDriverByName('GTiff') # gtiff_drv.Deregister() # ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/error.lbl', 1, 1, # options = ['DATA_LOCATION=GEOTIFF' ]) # gtiff_drv.Register() # if ds is not None: # gdaltest.post_reason('fail') # return 'fail' # cannot create GeoTIFF with gdaltest.error_handler(): ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/error.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF', 'EXTERNAL_FILENAME=/i_dont/exist/error.tif']) assert ds is None gdal.Unlink('/vsimem/error.lbl') # Output file has same name as input file src_ds = gdal.Translate('/vsimem/out.tif', 'data/byte.tif') with gdaltest.error_handler(): ds = gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', src_ds, options=['DATA_LOCATION=GEOTIFF']) assert ds is None gdal.Unlink('/vsimem/out.tif') # Missing /vsimem/out.cub src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', src_ds, options=['DATA_LOCATION=EXTERNAL']) gdal.Unlink('/vsimem/out.cub') with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl', gdal.GA_Update) assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') # Missing /vsimem/out.tif src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', src_ds, options=['DATA_LOCATION=GEOTIFF', 'GEOTIFF_OPTIONS=COMPRESS=LZW']) gdal.Unlink('/vsimem/out.tif') with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') # Invalid StartByte gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF', 'GEOTIFF_OPTIONS=COMPRESS=LZW']) gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube Object = Core StartByte = 2 Format = GeoTIFF ^Core = out.tif Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group Group = Pixels Type = UnsignedByte ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object End""") with gdaltest.error_handler(): gdal.Open('/vsimem/out.lbl') gdal.Unlink('/vsimem/out.tif') with gdaltest.error_handler(): gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') gdal.FileFromMemBuffer('/vsimem/out.lbl', 'IsisCube') assert gdal.IdentifyDriver('/vsimem/out.lbl') is not None with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube Object = Core Format = Tile Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group Group = Pixels Type = Real ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object End""") # Wrong tile dimensions : 0 x 0 with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions Samples = 0 Lines = 0 Bands = 0 End_Group Group = Pixels Type = Real ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object End""") # Invalid dataset dimensions : 0 x 0 with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 0 End_Group Group = Pixels Type = Real ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object End""") # Invalid band count : 0 with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group Group = Pixels Type = unhandled ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object End""") # unhandled format with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube Object = Core Format = unhandled Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group Group = Pixels Type = UnsignedByte ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object End""") # bad PDL formatting with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.FileFromMemBuffer('/vsimem/out.lbl', """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group End_Object End_Object End""") # missing Group = Pixels. This is actually valid. Assuming Real ds = gdal.Open('/vsimem/out.lbl') assert ds is not None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF', 'GEOTIFF_OPTIONS=COMPRESS=LZW']) # /vsimem/out.tif has incompatible characteristics with the ones declared in the label gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 2) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 2, 1) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 2) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 1, gdal.GDT_Int16) with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') gdal.Unlink('/vsimem/out.tif') gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF']) # /vsimem/out.tif has incompatible characteristics with the ones declared in the label gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 2) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert gdal.GetLastErrorMsg() != '' gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 2, 1) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert gdal.GetLastErrorMsg() != '' gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 2) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert gdal.GetLastErrorMsg() != '' gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, 1, gdal.GDT_Int16) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert gdal.GetLastErrorMsg() != '' gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, options=['COMPRESS=LZW']) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert gdal.GetLastErrorMsg() != '' gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1, options=['TILED=YES']) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert gdal.GetLastErrorMsg() != '' ds = gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 1, 1) ds.GetRasterBand(1).SetNoDataValue(0) ds.SetMetadataItem('foo', 'bar') ds = None gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('/vsimem/out.lbl') assert gdal.GetLastErrorMsg() != '' with gdaltest.error_handler(): gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') gdal.Unlink('/vsimem/out.tif') mem_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) with gdaltest.error_handler(): ds = gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', mem_ds, callback=cancel_cbk) assert ds is None # Delete would fail since ds is None gdal.Unlink('/vsimem/out.lbl') # Test CreateCopy() and scale and offset def test_isis_25(): mem_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1) mem_ds.GetRasterBand(1).SetScale(10) mem_ds.GetRasterBand(1).SetOffset(20) gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.lbl', mem_ds) ds = gdal.Open('/vsimem/out.lbl') assert ds.GetRasterBand(1).GetScale() == 10 assert ds.GetRasterBand(1).GetOffset() == 20 ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') # Test objects with same name def test_isis_26(): gdal.FileFromMemBuffer('/vsimem/in.lbl', """Object = IsisCube Object = Core StartByte = 1 Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group Group = Pixels Type = UnsignedByte ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object Object = Table Name = first_table End_Object Object = Table Name = second_table End_Object Object = foo x = A End_Object Object = foo x = B End_Object Object = foo x = C End_Object End""") gdal.Translate('/vsimem/out.lbl', '/vsimem/in.lbl', format='ISIS3') f = gdal.VSIFOpenL('/vsimem/out.lbl', 'rb') content = gdal.VSIFReadL(1, 10000, f).decode('ASCII') gdal.VSIFCloseL(f) assert ("""Object = Table Name = first_table End_Object Object = Table Name = second_table End_Object Object = foo x = A End_Object Object = foo x = B End_Object Object = foo x = C End_Object """ in content) gdal.Unlink('/vsimem/in.lbl') gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') # Test history def test_isis_27(): for src_location in ['LABEL', 'EXTERNAL']: for dst_location in ['LABEL', 'EXTERNAL']: gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, options=['DATA_LOCATION=' + src_location]) gdal.Translate('/vsimem/out2.lbl', '/vsimem/out.lbl', format='ISIS3', creationOptions=['DATA_LOCATION=' + dst_location]) f = gdal.VSIFOpenL('/vsimem/out2.lbl', 'rb') content = None if f is not None: content = gdal.VSIFReadL(1, 100000, f).decode('ASCII') gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/out2.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] lbl = json.loads(lbl) offset = lbl["History"]["StartByte"] - 1 size = lbl["History"]["Bytes"] if dst_location == 'EXTERNAL': assert lbl["Label"]["Bytes"] < 65536 history_filename = lbl['History']['^History'] if history_filename != 'out2.History.IsisCube': print(src_location) print(dst_location) pytest.fail(content) f = gdal.VSIFOpenL('/vsimem/' + history_filename, 'rb') history = None if f is not None: history = gdal.VSIFReadL(1, 100000, f).decode('ASCII') gdal.VSIFCloseL(f) if offset != 0 or size != len(history): print(src_location) print(dst_location) pytest.fail(content) else: assert lbl["Label"]["Bytes"] >= 65536 if offset + size != len(content): print(src_location) pytest.fail(dst_location) history = content[offset:] if not history.startswith('Object = ') or \ 'FROM = out.lbl' not in history or \ 'TO = out2.lbl' not in history or \ 'TO = out.lbl' not in history: print(src_location) print(dst_location) pytest.fail(content) gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') gdal.GetDriverByName('ISIS3').Delete('/vsimem/out2.lbl') # Test GDAL_HISTORY gdal.GetDriverByName('ISIS3').Create('/vsimem/out.lbl', 1, 1, options=['GDAL_HISTORY=foo']) f = gdal.VSIFOpenL('/vsimem/out.lbl', 'rb') content = None if f is not None: content = gdal.VSIFReadL(1, 100000, f).decode('ASCII') gdal.VSIFCloseL(f) assert 'foo' in content gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') # Test preservation of non-pixel sections def test_isis_28(): gdal.FileFromMemBuffer('/vsimem/in_table', "FOO") gdal.FileFromMemBuffer('/vsimem/in.lbl', """Object = IsisCube Object = Core StartByte = 1 Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group Group = Pixels Type = UnsignedByte ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object End_Object Object = Table Name = first_table StartByte = 1 Bytes = 3 ^Table = in_table End_Object End""") ds = gdal.Open('/vsimem/in.lbl') fl = ds.GetFileList() if fl != ['/vsimem/in.lbl', '/vsimem/in_table']: print(fl) return ds = None gdal.Translate('/vsimem/in_label.lbl', '/vsimem/in.lbl', format='ISIS3') for src_location in ['LABEL', 'EXTERNAL']: if src_location == 'LABEL': src = '/vsimem/in_label.lbl' else: src = '/vsimem/in.lbl' for dst_location in ['LABEL', 'EXTERNAL']: gdal.Translate('/vsimem/out.lbl', src, format='ISIS3', creationOptions=['DATA_LOCATION=' + dst_location]) f = gdal.VSIFOpenL('/vsimem/out.lbl', 'rb') content = None if f is not None: content = gdal.VSIFReadL(1, 100000, f).decode('ASCII') gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/out.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] lbl = json.loads(lbl) offset = lbl["Table_first_table"]["StartByte"] - 1 size = lbl["Table_first_table"]["Bytes"] if dst_location == 'EXTERNAL': table_filename = lbl['Table_first_table']['^Table'] if table_filename != 'out.Table.first_table': print(src_location) print(dst_location) pytest.fail(content) f = gdal.VSIFOpenL('/vsimem/' + table_filename, 'rb') table = None if f is not None: table = gdal.VSIFReadL(1, 100000, f).decode('ASCII') gdal.VSIFCloseL(f) if offset != 0 or size != 3 or size != len(table): print(src_location) print(dst_location) pytest.fail(content) else: if offset + size != len(content): print(src_location) pytest.fail(dst_location) table = content[offset:] if table != 'FOO': print(src_location) print(dst_location) pytest.fail(content) gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') gdal.GetDriverByName('ISIS3').Delete('/vsimem/in_label.lbl') gdal.GetDriverByName('ISIS3').Delete('/vsimem/in.lbl') # Test complete removal of history def test_isis_29(): with gdaltest.error_handler(): gdal.Translate('/vsimem/in.lbl', 'data/byte.tif', format='ISIS3') gdal.Translate('/vsimem/out.lbl', '/vsimem/in.lbl', options='-of ISIS3 -co USE_SRC_HISTORY=NO -co ADD_GDAL_HISTORY=NO') ds = gdal.Open('/vsimem/out.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] lbl = json.loads(lbl) assert 'History' not in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') gdal.Translate('/vsimem/out.lbl', '/vsimem/in.lbl', options='-of ISIS3 -co USE_SRC_HISTORY=NO -co ADD_GDAL_HISTORY=NO -co DATA_LOCATION=EXTERNAL') ds = gdal.Open('/vsimem/out.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] lbl = json.loads(lbl) assert 'History' not in lbl ds = None assert gdal.VSIStatL('/vsimem/out.History.IsisCube') is None gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.lbl') gdal.GetDriverByName('ISIS3').Delete('/vsimem/in.lbl') # Test Fill() on a GeoTIFF file def test_isis_30(): ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/test.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF']) ds.GetRasterBand(1).Fill(1) ds = None ds = gdal.Open('/vsimem/test.lbl') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/test.lbl') assert cs == 1 # Test correct working of block caching with a GeoTIFF file def test_isis_31(): gdal.SetConfigOption('GDAL_FORCE_CACHING', 'YES') ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/test.lbl', 1, 1, options=['DATA_LOCATION=GEOTIFF']) ds.WriteRaster(0, 0, 1, 1, struct.pack('B' * 1, 1)) ds = None gdal.SetConfigOption('GDAL_FORCE_CACHING', None) ds = gdal.Open('/vsimem/test.lbl') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/test.lbl') assert cs == 1 ############################################################################### def test_isis3_write_utm(): src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/temp.lbl', src_ds, options=['DATA_LOCATION=EXTERNAL']) ds = gdal.Open('/vsimem/temp.lbl') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None f = gdal.VSIFOpenL('/vsimem/temp.lbl', 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'MinimumLongitude = -117.6411686' in data, data assert 'MaximumLongitude = -117.6281108' in data, data assert 'MaximumLatitude = 33.90241956' in data, data assert 'MinimumLatitude = 33.891530168' in data, data gdal.GetDriverByName('ISIS3').Delete('/vsimem/temp.lbl') ############################################################################### # Test bugfix https://github.com/OSGeo/gdal/issues/1510 def test_isis3_parse_list_and_write_quote_string_in_list(): src_ds = gdal.Open('data/isis3/FC21B0037339_15142232818F1C_3bands_truncated.cub') gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/temp.lbl', src_ds, options=['DATA_LOCATION=EXTERNAL']) f = gdal.VSIFOpenL('/vsimem/temp.lbl', 'rb') if f: data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'FilterNumber = (1, 1, 1)' in data, data assert 'FilterName = (Clear_F1, Clear_F1, Clear_F1)' in data, data assert 'Name = ("band 1", "band 2", "band 3")' in data, data gdal.GetDriverByName('ISIS3').Delete('/vsimem/temp.lbl') ############################################################################### # def test_isis3_bandbin_single_band(): gdal.FileFromMemBuffer('/vsimem/test.lbl', """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 1 End_Group Group = Pixels Type = Real ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object Group = BandBin FilterName = "ignored" Name = "My band name" Center = 700 Width = 300 End_Group End_Object End""") ds = gdal.Open('/vsimem/test.lbl') assert ds band = ds.GetRasterBand(1) assert band.GetDescription() == 'My band name' assert band.GetMetadata() == { 'BANDWIDTH': '300.000000', 'BANDWIDTH_UNIT': 'NANOMETERS', 'WAVELENGTH': '700.000000', 'WAVELENGTH_UNIT': 'NANOMETERS' } ds = None gdal.Unlink('/vsimem/test.lbl') ############################################################################### # def test_isis3_bandbin_multiple_bands(): gdal.FileFromMemBuffer('/vsimem/test.lbl', """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 2 End_Group Group = Pixels Type = Real ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object Group = BandBin BandSuffixName = ("first band", "second band") BandSuffixUnit = (DEGREE, DEGREE) BandBinCenter = (1.0348, 1.3128) BandBinUnit = MICROMETER Width = (0.5, 0.6) End_Group End_Object End""") ds = gdal.Open('/vsimem/test.lbl') assert ds band = ds.GetRasterBand(1) assert band.GetDescription() == 'first band' assert band.GetUnitType() == 'DEGREE' assert band.GetMetadata() == { 'BANDWIDTH': '0.500000', 'BANDWIDTH_UNIT': 'um', 'WAVELENGTH': '1.034800', 'WAVELENGTH_UNIT': 'MICROMETER' } band = ds.GetRasterBand(2) assert band.GetDescription() == 'second band' assert band.GetMetadata() == { 'BANDWIDTH': '0.600000', 'BANDWIDTH_UNIT': 'um', 'WAVELENGTH': '1.312800', 'WAVELENGTH_UNIT': 'MICROMETER' } ds = None gdal.Unlink('/vsimem/test.lbl') ############################################################################### # Test that when converting from ISIS3 to other formats (PAM-enabled), the # json:ISIS3 metadata domain is preserved. def test_isis3_preserve_label_across_format(): gdal.FileFromMemBuffer('/vsimem/multiband.lbl', """Object = IsisCube Object = Core Format = BandSequential Group = Dimensions Samples = 1 Lines = 1 Bands = 2 End_Group Group = Pixels Type = UnsignedByte ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object Group = BandBin BandSuffixName = ("first band", "second band") BandSuffixUnit = (DEGREE, DEGREE) BandBinCenter = (1.0, 2.0) BandBinUnit = MICROMETER Width = (0.5, 1.0) End_Group End_Object End""") src_ds = gdal.Open('/vsimem/multiband.lbl') # Copy ISIS3 to GeoTIFF gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', src_ds) # Check GeoTIFF ds = gdal.Open('/vsimem/out.tif') assert len(ds.GetMetadataDomainList()) == 3 assert set(ds.GetMetadataDomainList()) == set(['IMAGE_STRUCTURE', 'json:ISIS3', 'DERIVED_SUBDATASETS']) lbl = ds.GetMetadata_List('json:ISIS3')[0] assert lbl ds = None assert gdal.VSIStatL('/vsimem/out.tif.aux.xml') # Check that the label is in PAM, and not internal to GTiff with gdaltest.config_option('GDAL_PAM_ENABLED', 'NO'): ds = gdal.Open('/vsimem/out.tif') assert not ds.GetMetadata_List('json:ISIS3') # Copy back from GeoTIFF to ISIS3 src_ds_gtiff = gdal.Open('/vsimem/out.tif') gdal.GetDriverByName('ISIS3').CreateCopy('/vsimem/out.cub', src_ds_gtiff) assert not gdal.VSIStatL('/vsimem/out.cub.aux.xml') ds = gdal.Open('/vsimem/out.cub') lbl = ds.GetMetadata_List('json:ISIS3')[0] # Check label preservation assert 'BandBin' in lbl ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/out.tif') gdal.GetDriverByName('ISIS3').Delete('/vsimem/out.cub') # Copy ISIS3 to PDS4 with gdaltest.error_handler(): gdal.GetDriverByName('PDS4').CreateCopy('/vsimem/out.xml', src_ds) ds = gdal.Open('/vsimem/out.xml') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert lbl ds = None assert gdal.VSIStatL('/vsimem/out.xml.aux.xml') gdal.GetDriverByName('PDS4').Delete('/vsimem/out.xml') # Copy ISIS3 to PNG gdal.GetDriverByName('PNG').CreateCopy('/vsimem/out.png', src_ds) ds = gdal.Open('/vsimem/out.png') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert lbl ds = None assert gdal.VSIStatL('/vsimem/out.png.aux.xml') gdal.GetDriverByName('PNG').Delete('/vsimem/out.png') # Check GeoTIFF with non pure copy mode (test gdal_translate_lib) gdal.Translate('/vsimem/out.tif', src_ds, options = '-mo FOO=BAR') ds = gdal.Open('/vsimem/out.tif') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert lbl ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/out.tif') # Test converting a subset of bands gdal.Translate('/vsimem/out.tif', src_ds, options = '-b 2 -mo FOO=BAR') ds = gdal.Open('/vsimem/out.tif') lbl = ds.GetMetadata_List('json:ISIS3')[0] lbl = json.loads(lbl) assert lbl['IsisCube']['BandBin'] == json.loads("""{ "_type":"group", "BandBinUnit":"MICROMETER", "Width":{ "unit":"um", "value":[ 1.000000 ] }, "BandSuffixName":[ "second band" ], "BandSuffixUnit":[ "DEGREE" ], "BandBinCenter":[ 2.000000 ] }""") assert 'OriginalBandBin' in lbl['IsisCube'] assert lbl['IsisCube']['OriginalBandBin'] == json.loads("""{ "_type":"group", "BandSuffixName":[ "first band", "second band" ], "BandSuffixUnit":[ "DEGREE", "DEGREE" ], "BandBinCenter":[ 1.000000, 2.000000 ], "BandBinUnit":"MICROMETER", "Width":{ "value":[ 0.500000, 1.000000 ], "unit":"um" } }""") ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/out.tif') src_ds = None gdal.Unlink('/vsimem/multiband.lbl') def test_isis3_point_perspective_read(): ds = gdal.Open('data/isis3/isis3_pointperspective.cub') assert ds.GetSpatialRef().ExportToProj4() == '+proj=nsper +lat_0=-10 +lon_0=-90 +h=31603810 +x_0=0 +y_0=0 +R=3396190 +units=m +no_defs' def test_isis3_point_perspective_write(): if osr.GetPROJVersionMajor() < 7: pytest.skip() sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 3000000, 0) sr.SetVerticalPerspective(1, 2, 0, 1000, 0, 0) ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', 1, 1) ds.SetSpatialRef(sr) ds.SetGeoTransform([-10, 1, 0, 40, 0, -1]) ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"CenterLatitude":1.0' in lbl assert '"CenterLongitude":2.0' in lbl assert '"Distance":3001.0' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') def test_isis3_oblique_cylindrical_read(): ds = gdal.Open('data/isis3/isis3_obliquecylindrical.cub') srs = ds.GetSpatialRef() assert srs.ExportToProj4() == '+proj=ob_tran +o_proj=eqc +o_lon_p=-90 +o_lat_p=180 +lon_0=0 +R=3396190 +units=m +no_defs' pixel = ds.RasterXSize / 2.0 line = ds.RasterYSize / 2.0 gt = ds.GetGeoTransform() x = gt[0] + pixel * gt[1] + line * gt[2] y = gt[3] + pixel * gt[4] + line * gt[5] geog_srs = srs.CloneGeogCS() ct = osr.CoordinateTransformation(srs, geog_srs) lon, lat, _ = ct.TransformPoint(x, y) assert lon == pytest.approx(90.0) assert lat == pytest.approx(-45.0, 1e-2) def test_isis3_oblique_cylindrical_write(): src_ds = gdal.Open('data/isis3/isis3_obliquecylindrical.cub') ds = gdal.GetDriverByName('ISIS3').Create('/vsimem/isis_tmp.lbl', src_ds.RasterXSize, src_ds.RasterYSize) ds.SetSpatialRef(src_ds.GetSpatialRef()) ds.SetGeoTransform(src_ds.GetGeoTransform()) src_ds = None ds = None ds = gdal.Open('/vsimem/isis_tmp.lbl') lbl = ds.GetMetadata_List('json:ISIS3')[0] assert '"PoleLongitude":0.0' in lbl assert '"PoleLatitude":0.0' in lbl assert '"PoleRotation":90.0' in lbl ds = None gdal.GetDriverByName('ISIS3').Delete('/vsimem/isis_tmp.lbl') gdalautotest-3.2.2/gdrivers/daas_real_instance.py0000775000175000017500000000515614020414370020677 0ustar eveneven#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################### # $Id: daas_real_instance.py 72d72e44948b097fbe937beb0c171c8d529c4309 2021-01-21 17:12:03 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: DAAS driver test suite. # Author: Even Rouault, even.rouault at spatialys.com # ############################################################################### # Copyright (c) 2021, Airbus DS Intelligence # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import pytest pytestmark = pytest.mark.require_driver('DAAS') ############################################################################### # Test accessing a real DAAS asset def test_daas_real_instance(): if gdal.GetConfigOption('GDAL_DAAS_ACCESS_TOKEN') is None and \ gdal.GetConfigOption('GDAL_DAAS_API_KEY') is None and \ gdal.GetConfigOption('GDAL_DAAS_CLIENT_ID') is None: pytest.skip('Missing authentication elements: GDAL_DAAS_ACCESS_TOKEN or GDAL_DAAS_API_KEY+GDAL_DAAS_CLIENT_ID') md_url = gdal.GetConfigOption('GDAL_AUTOTEST_DAAS_GET_METADATA_URL') if md_url is None: pytest.skip('Missing GDAL_AUTOTEST_DAAS_GET_METADATA_URL with a URL to the GetMetadata URL of the scene to test') gdal.ErrorReset() ds = gdal.Open('DAAS:' + md_url) assert ds is not None req_xsize = min(1024, ds.RasterXSize) req_ysize = min(1024, ds.RasterYSize) assert ds.ReadRaster(0, 0, req_xsize, req_ysize) is not None assert ds.GetLastErrorMsg() == '' gdalautotest-3.2.2/gdrivers/rraster.py0000775000175000017500000003623214020414370016561 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: rraster.py 6a31470cb4545bad0834fa7fbc67f282d7b92764 2020-05-10 15:54:00 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test RRASTER format driver. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2016, Even Rouault, # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import pprint from osgeo import gdal from osgeo import osr import gdaltest ############################################################################### # Perform simple read test. def test_rraster_1(filename='data/rraster/byte_rraster.grd', check_prj=None): tst = gdaltest.GDALTest('RRASTER', filename, 1, 4672, filename_absolute=True) ref_ds = gdal.Open('data/byte.tif') if check_prj is None: check_prj = ref_ds.GetProjectionRef() tst.testOpen(check_prj=check_prj, check_gt=ref_ds.GetGeoTransform(), check_min=74, check_max=255) ds = gdal.Open(filename) md = ds.GetMetadata() assert md == {'CREATOR': "R package 'raster'", 'CREATED': '2016-06-25 17:32:47'} assert ds.GetRasterBand(1).GetDescription() == 'byte' ############################################################################### def test_rraster_1_copy(): filename = '/vsimem/rraster/byte_rraster.grd' gdal.Translate(filename, 'data/rraster/byte_rraster.grd', format='RRASTER') assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' sr = osr.SpatialReference() sr.SetFromUserInput('+proj=utm +zone=11 +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat +units=m +no_defs') test_rraster_1(filename, check_prj=sr.ExportToWkt()) gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def _compare_val(got, expected, key_name, to_print): if isinstance(got, list) and isinstance(expected, list): if len(got) != len(expected): print('Unexpected number of elements for %s. Got %d, expected %d' % (key_name, len(got), len(expected))) pprint.pprint(to_print) return False for i, val in enumerate(got): if not _compare_val(val, expected[i], '%s[%d]' % (key_name, i), to_print): return False elif isinstance(got, dict) and isinstance(expected, dict): if not _is_dict_included_in_dict(got, expected, key_name, to_print): pprint.pprint(to_print) return False elif got != expected: print('Value for %s is different' % key_name) pprint.pprint(got) return False return True ############################################################################### def _is_dict_included_in_dict(got, expected, key_name='', to_print=None): if to_print is None: to_print = got for k in expected: if k not in got: print('Missing %s' % k) return False if not _compare_val(got[k], expected[k], key_name + '/' + k, to_print): return False return True ############################################################################### def test_rraster_rgba(filename='data/rraster/rgba_rraster.grd'): ds = gdal.Open(filename) info = gdal.Info(ds, computeChecksum=True, format='json') expected_info = { 'bands': [{'band': 1, 'block': [2, 1], 'checksum': 19, 'colorInterpretation': 'Red', 'description': 'red'}, {'band': 2, 'block': [2, 1], 'checksum': 27, 'colorInterpretation': 'Green', 'description': 'green'}, {'band': 3, 'block': [2, 1], 'checksum': 22, 'colorInterpretation': 'Blue', 'description': 'blue'}, {'band': 4, 'block': [2, 1], 'checksum': 7, 'colorInterpretation': 'Alpha', 'description': 'alpha'}] } assert _is_dict_included_in_dict(info, expected_info) ############################################################################### def test_rraster_rgba_copy(): filename = '/vsimem/rgba_rraster.grd' for creationOptions in [[], ['INTERLEAVE=BIP'], ['INTERLEAVE=BIL'], ['INTERLEAVE=BSQ']]: gdal.Translate(filename, 'data/rraster/rgba_rraster.grd', format='RRASTER', creationOptions=creationOptions) assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' print(creationOptions) test_rraster_rgba(filename) gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_ct_rgb(filename='data/rraster/byte_rraster_ct_rgb.grd'): ds = gdal.Open(filename) info = gdal.Info(ds, format='json') expected_info = { 'bands': [{'band': 1, 'colorInterpretation': 'Palette', 'colorTable': {'count': 2, 'entries': [[10, 20, 30, 255], [11, 21, 31, 255]], 'palette': 'RGB'}, 'type': 'Byte'}] } assert _is_dict_included_in_dict(info, expected_info) ############################################################################### def test_rraster_ct_rgb_copy(): filename = '/vsimem/rraster/byte_rraster_ct_rgb.grd' gdal.Translate(filename, 'data/rraster/byte_rraster_ct_rgb.grd', format='RRASTER') assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' test_rraster_ct_rgb(filename) gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_ct_rgba(filename='data/rraster/byte_rraster_ct_rgba.grd'): ds = gdal.Open(filename) info = gdal.Info(ds, format='json') expected_info = { 'bands': [{'band': 1, 'colorInterpretation': 'Palette', 'colorTable': {'count': 2, 'entries': [[10, 20, 30, 0], [11, 21, 31, 255]], 'palette': 'RGB'}, 'type': 'Byte'}] } assert _is_dict_included_in_dict(info, expected_info) ############################################################################### def test_rraster_ct_rgba_copy(): filename = '/vsimem/rraster/byte_rraster_ct_rgba.grd' gdal.Translate(filename, 'data/rraster/byte_rraster_ct_rgba.grd', format='RRASTER') assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' test_rraster_ct_rgba(filename) gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_rat(filename='data/rraster/byte_rraster_rat.grd'): ds = gdal.Open(filename) info = gdal.Info(ds, format='json') expected_info = { 'bands': [{'band': 1, 'block': [20, 1], 'colorInterpretation': 'Undefined', 'metadata': {}, 'type': 'Byte'}], 'rat': {'fieldDefn': [{'index': 0, 'name': 'ID', 'type': 0, 'usage': 0}, {'index': 1, 'name': 'int_field', 'type': 0, 'usage': 0}, {'index': 2, 'name': 'numeric_field', 'type': 1, 'usage': 0}, {'index': 3, 'name': 'string_field', 'type': 2, 'usage': 0}, {'index': 4, 'name': 'red', 'type': 0, 'usage': 6}, {'index': 5, 'name': 'green', 'type': 0, 'usage': 7}, {'index': 6, 'name': 'blue', 'type': 0, 'usage': 8}, {'index': 7, 'name': 'alpha', 'type': 0, 'usage': 9}, {'index': 8, 'name': 'pixelcount', 'type': 0, 'usage': 1}, {'index': 9, 'name': 'name', 'type': 2, 'usage': 2}], 'row': [{'f': [0, 10, 1.2, 'foo', 0, 2, 4, 6, 8, 'baz'], 'index': 0}, {'f': [1, 11, 2.3, 'bar', 1, 3, 5, 7, 9, 'baw'], 'index': 1}]} } assert _is_dict_included_in_dict(info, expected_info) ############################################################################### def test_rraster_rat_copy(): filename = '/vsimem/rraster/byte_rraster_rat.grd' gdal.Translate(filename, 'data/rraster/byte_rraster_rat.grd', format='RRASTER') assert not gdal.VSIStatL(filename + '.aux.xml'), 'did not expect .aux.xml' test_rraster_rat(filename) gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_signedbyte(): filename = '/vsimem/rraster_signedbyte.grd' filename2 = '/vsimem/rraster_signedbyte2.grd' gdal.Translate(filename, 'data/rraster/byte_rraster.grd', format='RRASTER', creationOptions=['PIXELTYPE=SIGNEDBYTE']) gdal.Translate(filename2, filename, format='RRASTER') ds = gdal.Open(filename2) assert ds.GetRasterBand(1).GetMetadataItem('PIXELTYPE', 'IMAGE_STRUCTURE') == 'SIGNEDBYTE' assert ds.GetRasterBand(1).GetMinimum() == -124 ds = None gdal.GetDriverByName('RRASTER').Delete(filename) gdal.GetDriverByName('RRASTER').Delete(filename2) ############################################################################### def test_rraster_datatypes(): filename = '/vsimem/temp.grd' for srcfilename in ['../gcore/data/uint16.tif', '../gcore/data/int16.tif', '../gcore/data/uint32.tif', '../gcore/data/int32.tif', '../gcore/data/float32.tif', '../gcore/data/float64.tif']: src_ds = gdal.Open(srcfilename) gdal.Translate(filename, src_ds, format='RRASTER') ds = gdal.Open(filename) assert ds.GetRasterBand(1).DataType == src_ds.GetRasterBand(1).DataType, \ srcfilename assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ srcfilename gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_nodata_and_metadata(): filename = '/vsimem/temp.grd' ds = gdal.GetDriverByName('RRASTER').Create(filename, 1, 1) ds.GetRasterBand(1).SetNoDataValue(1) ds.GetRasterBand(1).SetColorTable(None) ds.GetRasterBand(1).SetDefaultRAT(None) ds.SetMetadataItem('CREATOR', 'GDAL') ds.SetMetadataItem('CREATED', 'Today') ds = None ds = gdal.Open(filename) assert ds.GetMetadata() == {'CREATOR': 'GDAL', 'CREATED': 'Today'} assert ds.GetRasterBand(1).GetNoDataValue() == 1 ds = None gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_update(): filename = '/vsimem/temp.grd' gdal.Translate(filename, 'data/rraster/byte_rraster.grd', format='RRASTER') gdal.Open(filename, gdal.GA_Update) ds = gdal.Open(filename, gdal.GA_Update) assert ds.GetRasterBand(1).Checksum() == 4672 ds.GetRasterBand(1).Fill(0) ds = None ds = gdal.Open(filename) assert ds.GetRasterBand(1).Checksum() == 0 ds = None gdal.GetDriverByName('RRASTER').Delete(filename) ############################################################################### def test_rraster_colorinterpretation(): filename = '/vsimem/temp.grd' ds = gdal.GetDriverByName('RRASTER').Create(filename, 1, 1, 4) ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_BlueBand) ds.GetRasterBand(4).SetColorInterpretation(gdal.GCI_AlphaBand) ds = None ds = gdal.Open(filename) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None gdal.GetDriverByName('RRASTER').Delete(filename) gdalautotest-3.2.2/gdrivers/kro.py0000775000175000017500000000615514020414370015673 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: kro.py ada4469c9470977a9f62f0822417b101af9cfb9e 2020-05-10 18:26:17 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Even Rouault, # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2014, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Create 3-band byte def test_kro_1(): tst = gdaltest.GDALTest('KRO', 'rgbsmall.tif', 2, 21053) return tst.testCreate() ############################################################################### # Create 1-band uint16 def test_kro_2(): tst = gdaltest.GDALTest('KRO', '../../gcore/data/uint16.tif', 1, 4672) return tst.testCreate() ############################################################################### # Create 1-band float32 def test_kro_3(): tst = gdaltest.GDALTest('KRO', '../../gcore/data/float32.tif', 1, 4672) return tst.testCreate() ############################################################################### # Create 4-band rgba uint16 def test_kro_4(): tst = gdaltest.GDALTest('KRO', 'png/rgba16.png', 1, 1886) return tst.testCreate() ############################################################################### # Test optimized IO def test_kro_5(): # Determine if the filesystem supports sparse files (we don't want to create a real 10 GB # file ! if not gdaltest.filesystem_supports_sparse_files('tmp'): pytest.skip() ds = gdal.GetDriverByName('KRO').Create('tmp/kro_5.kro', 100000, 10000, 4) ds = None ds = gdal.Open('tmp/kro_5.kro') ds.ReadRaster(int(ds.RasterXSize / 2), int(ds.RasterYSize / 2), 100, 100) ds = None gdal.Unlink('tmp/kro_5.kro') gdalautotest-3.2.2/gdrivers/terragen.py0000775000175000017500000000441414020414370016703 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # # Project: GDAL/OGR Test Suite # Purpose: Terrage Testing. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2017, Even Rouault, # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest ############################################################################### def test_terragen_1(): tst = gdaltest.GDALTest('terragen', 'terragen/float32.ter', 1, 1128) return tst.testOpen() ############################################################################### # Write def test_terragen_2(): gdal.Translate('/vsimem/out.ter', 'data/float32.tif', options='-of TERRAGEN -co MINUSERPIXELVALUE=74 -co MAXUSERPIXELVALUE=255') gdal.Translate('/vsimem/out.tif', '/vsimem/out.ter', options='-unscale') ds = gdal.Open('/vsimem/out.tif') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None gdal.GetDriverByName('TERRAGEN').Delete('/vsimem/out.ter') gdal.GetDriverByName('TERRAGEN').Delete('/vsimem/out.tif') gdalautotest-3.2.2/gdrivers/grassasciigrid.py0000775000175000017500000000404614020414370020073 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: grassasciigrid.py 222b5c5c39a70f2c3d0ae02bc98adcb49b66e60d 2020-05-10 17:56:42 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GRASS ASCII Grid support. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import gdaltest ############################################################################### # Perform simple read test. def test_grassasciigrid_1(): tst = gdaltest.GDALTest('GRASSASCIIGrid', 'grassasciigrid/grassascii.txt', 1, 212) expected_gt = [-100.0, 62.5, 0.0, 250.0, 0.0, -41.666666666666664] return tst.testOpen(check_gt=expected_gt) ############################################################################### gdalautotest-3.2.2/gdrivers/mrsid.py0000775000175000017500000004054214020414370016214 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: mrsid.py b6c71e69565f9e1a99d8ad3a3c7ac8903904e49f 2020-10-09 14:54:43 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for MrSID driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # Copyright (c) 2009-2012, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import shutil from osgeo import gdal import gdaltest import pytest pytestmark = pytest.mark.require_driver('MrSID') ############################################################################### @pytest.fixture(autouse=True, scope='module') def startup_and_cleanup(): gdaltest.mrsid_drv = gdal.GetDriverByName('MrSID') gdaltest.jp2mrsid_drv = gdal.GetDriverByName('JP2MrSID') if gdaltest.jp2mrsid_drv: gdaltest.deregister_all_jpeg2000_drivers_but('JP2MrSID') yield gdaltest.reregister_all_jpeg2000_drivers() try: os.remove('data/sid/mercator.sid.aux.xml') os.remove('data/sid/mercator_new.sid.aux.xml') except OSError: pass ############################################################################### # Read a simple byte file, checking projections and geotransform. def test_mrsid_1(): tst = gdaltest.GDALTest('MrSID', 'sid/mercator.sid', 1, None) gt = (-15436.385771224039, 60.0, 0.0, 3321987.8617962394, 0.0, -60.0) # # Old, internally generated. # prj = """PROJCS["MER E000|", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Mercator_1SP"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""" # # MrSID SDK getWKT() method. # prj = """PROJCS["MER E000|", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982139006, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Mercator_1SP"], PARAMETER["latitude_of_origin",1], PARAMETER["central_meridian",1], PARAMETER["scale_factor",1], PARAMETER["false_easting",1], PARAMETER["false_northing",1], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""" # # MrSID SDK getWKT() method - DSDK 8 and newer? # prj = """PROJCS["MER E000|", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982139006, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""" tst.testOpen(check_gt=gt, check_stat=(0.0, 255.0, 103.319, 55.153), check_approx_stat=(2.0, 243.0, 103.131, 43.978)) ds = gdal.Open('data/sid/mercator.sid') got_prj = ds.GetProjectionRef() ds = None if prj.find('North_American_Datum_1927') == -1 or \ prj.find('Mercator_1SP') == -1: print(got_prj) pytest.fail('did not get expected projection') if got_prj != prj: print('Warning: did not get exactly expected projection. Got %s' % got_prj) ############################################################################### # Do a direct IO to read the image at a resolution for which there is no # builtin overview. Checks for the bug Steve L found in the optimized # RasterIO implementation. def test_mrsid_2(): ds = gdal.Open('data/sid/mercator.sid') try: data = ds.ReadRaster(0, 0, 515, 515, buf_xsize=10, buf_ysize=10) except: pytest.fail('Small overview read failed: ' + gdal.GetLastErrorMsg()) ds = None is_bytes = False if (isinstance(data, bytes) and not isinstance(data, str)): is_bytes = True # check that we got roughly the right values by checking mean. if is_bytes is True: total = sum(data) else: total = sum([ord(c) for c in data]) mean = float(total) / len(data) assert mean >= 95 and mean <= 105, 'image mean out of range.' ############################################################################### # Test overview reading. def test_mrsid_3(): ds = gdal.Open('data/sid/mercator.sid') band = ds.GetRasterBand(1) assert band.GetOverviewCount() == 4, 'did not get expected overview count' new_stat = band.GetOverview(3).GetStatistics(0, 1) check_stat = (11.0, 230.0, 103.42607897153351, 39.952592422557757) stat_epsilon = 0.0001 for i in range(4): if new_stat[i] != pytest.approx(check_stat[i], abs=stat_epsilon): print('') print('old = ', check_stat) print('new = ', new_stat) pytest.fail('Statistics differ.') ############################################################################### # Check a new (V3) file which uses a different form for coordinate sys. def test_mrsid_4(): try: os.remove('data/sid/mercator_new.sid.aux.xml') except OSError: pass tst = gdaltest.GDALTest('MrSID', 'sid/mercator_new.sid', 1, None) gt = (-15436.385771224039, 60.0, 0.0, 3321987.8617962394, 0.0, -60.0) prj = """PROJCS["MER E000", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Mercator_1SP"], PARAMETER["latitude_of_origin",33.76446202777777], PARAMETER["central_meridian",-117.4745428888889], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""" ret = tst.testOpen(check_gt=gt, check_prj=prj, check_stat=(0.0, 255.0, 103.112, 52.477), check_approx_stat=(0.0, 255.0, 102.684, 51.614)) try: os.remove('data/sid/mercator_new.sid.aux.xml') except OSError: pass return ret ############################################################################### # Open byte.jp2 def test_mrsid_6(): if gdaltest.jp2mrsid_drv is None: pytest.skip() srs = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26711"]] """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('JP2MrSID', 'jpeg2000/byte.jp2', 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Open int16.jp2 def test_mrsid_7(): if gdaltest.jp2mrsid_drv is None: pytest.skip() ds = gdal.Open('data/jpeg2000/int16.jp2') ds_ref = gdal.Open('data/int16.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref) if maxdiff > 5: print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None pytest.fail('Image too different from reference') ds = None ds_ref = None ############################################################################### # Test PAM override for nodata, coordsys, and geotransform. def test_mrsid_8(): new_gt = (10000, 50, 0, 20000, 0, -50) new_srs = """PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB_1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27700"]]""" gdal.PushErrorHandler('CPLQuietErrorHandler') gdal.GetDriverByName('MrSID').Delete('tmp/mercator.sid') gdal.PopErrorHandler() shutil.copyfile('data/sid/mercator.sid', 'tmp/mercator.sid') ds = gdal.Open('tmp/mercator.sid') ds.SetGeoTransform(new_gt) ds.SetProjection(new_srs) ds.GetRasterBand(1).SetNoDataValue(255) ds = None ds = gdal.Open('tmp/mercator.sid') assert new_srs == ds.GetProjectionRef(), 'SRS Override failed.' assert new_gt == ds.GetGeoTransform(), 'Geotransform Override failed.' assert ds.GetRasterBand(1).GetNoDataValue() == 255, 'Nodata override failed.' ds = None gdal.GetDriverByName('MrSID').Delete('tmp/mercator.sid') ############################################################################### # Test VSI*L IO with .sid def test_mrsid_9(): f = open('data/sid/mercator.sid', 'rb') data = f.read() f.close() f = gdal.VSIFOpenL('/vsimem/mrsid_9.sid', 'wb') gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/mrsid_9.sid') assert ds is not None ds = None gdal.Unlink('/vsimem/mrsid_9.sid') ############################################################################### # Test VSI*L IO with .jp2 def test_mrsid_10(): if gdaltest.jp2mrsid_drv is None: pytest.skip() f = open('data/jpeg2000/int16.jp2', 'rb') data = f.read() f.close() f = gdal.VSIFOpenL('/vsimem/mrsid_10.jp2', 'wb') gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/mrsid_10.jp2') assert ds is not None ds = None gdal.Unlink('/vsimem/mrsid_10.jp2') ############################################################################### # Check that we can use .j2w world files (#4651) def test_mrsid_11(): if gdaltest.jp2mrsid_drv is None: pytest.skip() ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ 'geotransform differs from expected' ds = None ############################################################################### def test_mrsid_online_1(): if gdaltest.jp2mrsid_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k', '7sisters200.j2k'): pytest.skip() # Checksum = 29473 on my PC tst = gdaltest.GDALTest('JP2MrSID', 'tmp/cache/7sisters200.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/7sisters200.j2k') ds.GetRasterBand(1).Checksum() ds = None ############################################################################### def test_mrsid_online_2(): if gdaltest.jp2mrsid_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2', 'gcp.jp2'): pytest.skip() # Checksum = 209 on my PC tst = gdaltest.GDALTest('JP2MrSID', 'tmp/cache/gcp.jp2', 1, None, filename_absolute=1) tst.testOpen() # The JP2MrSID driver doesn't handle GCPs ds = gdal.Open('tmp/cache/gcp.jp2') ds.GetRasterBand(1).Checksum() # if len(ds.GetGCPs()) != 15: # gdaltest.post_reason('bad number of GCP') # return 'fail' # # expected_wkt = """GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]""" # if ds.GetGCPProjection() != expected_wkt: # gdaltest.post_reason('bad GCP projection') # return 'fail' ds = None ############################################################################### def test_mrsid_online_3(): if gdaltest.jp2mrsid_drv is None: pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.j2k', 'Bretagne1.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.bmp', 'Bretagne1.bmp'): pytest.skip() # checksum = 14443 on my PC tst = gdaltest.GDALTest('JP2MrSID', 'tmp/cache/Bretagne1.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/Bretagne1.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne1.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds = None ds_ref = None # Difference between the image before and after compression if maxdiff > 17: print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from reference') ############################################################################### def test_mrsid_online_4(): if gdaltest.jp2mrsid_drv is None: pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.j2k', 'Bretagne2.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.bmp', 'Bretagne2.bmp'): pytest.skip() # Checksum = 53186 on my PC tst = gdaltest.GDALTest('JP2MrSID', 'tmp/cache/Bretagne2.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/Bretagne2.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne2.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref, width=256, height=256) ds = None ds_ref = None # Difference between the image before and after compression if maxdiff > 1: print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) pytest.fail('Image too different from reference') gdalautotest-3.2.2/gdrivers/ecw.py0000775000175000017500000021604114020414370015653 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ecw.py b6c71e69565f9e1a99d8ad3a3c7ac8903904e49f 2020-10-09 14:54:43 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for ECW driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2013, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import os.path import sys from sys import version_info import array import shutil from osgeo import gdal from osgeo import osr import gdaltest import pytest pytestmark = pytest.mark.require_driver('ECW') ############################################################################### def has_write_support(): if hasattr(gdaltest, 'b_ecw_has_write_support'): return gdaltest.b_ecw_has_write_support gdaltest.b_ecw_has_write_support = False ecw_drv = gdal.GetDriverByName('ECW') if ecw_drv is None or ecw_drv.GetMetadataItem('DMD_CREATIONDATATYPES') is None: return False ds = gdal.Open('data/ecw/jrc.ecw') if ds: out_ds = ecw_drv.CreateCopy('tmp/jrc_out.ecw', ds, options=['TARGET=75']) if out_ds: out_ds = None gdaltest.b_ecw_has_write_support = True try: os.remove('tmp/jrc_out.ecw') except OSError: pass try: os.remove('tmp/jrc_out.ecw.aux.xml') except OSError: pass else: if 'ECW_ENCODE_KEY' not in gdal.GetLastErrorMsg(): pytest.fail('ECW creation failed for unknown reason') return gdaltest.b_ecw_has_write_support ############################################################################### @pytest.fixture(autouse=True, scope='module') def startup_and_cleanup(): gdaltest.ecw_drv = gdal.GetDriverByName('ECW') assert gdaltest.ecw_drv is not None gdaltest.jp2ecw_drv = gdal.GetDriverByName('JP2ECW') gdaltest.deregister_all_jpeg2000_drivers_but('JP2ECW') longname = gdaltest.ecw_drv.GetMetadataItem('DMD_LONGNAME') sdk_off = longname.find('SDK ') if sdk_off != -1: gdaltest.ecw_drv.major_version = int(float(longname[sdk_off + 4])) sdk_minor_off = longname.find('.', sdk_off) if sdk_minor_off >= 0: if longname[sdk_minor_off + 1] == 'x': gdaltest.ecw_drv.minor_version = 3 else: gdaltest.ecw_drv.minor_version = int(longname[sdk_minor_off + 1]) else: gdaltest.ecw_drv.minor_version = 0 else: gdaltest.ecw_drv.major_version = 3 gdaltest.ecw_drv.minor_version = 3 # we set ECW to not resolve projection and datum strings to get 3.x behavior. gdal.SetConfigOption("ECW_DO_NOT_RESOLVE_DATUM_PROJECTION", "YES") yield gdaltest.reregister_all_jpeg2000_drivers() try: os.remove('tmp/jrc_out.ecw') except OSError: pass try: os.remove('tmp/jrc_out.ecw.aux.xml') except OSError: pass try: os.remove('tmp/ecw_5.jp2') except OSError: pass try: os.remove('tmp/ecw_5.jp2.aux.xml') except OSError: pass try: os.remove('tmp/ecw_7.ntf') except OSError: pass try: os.remove('tmp/ecw9.jp2') except OSError: pass try: os.remove('tmp/test_11.ntf') except OSError: pass try: os.remove('tmp/rgb_gcp.jp2') except OSError: pass try: os.remove('tmp/spif83.ecw') except OSError: pass try: os.remove('tmp/spif83.ecw.aux.xml') except OSError: pass try: os.remove('tmp/UInt16_big_out.ecw') except OSError: pass try: os.remove('tmp/UInt16_big_out.jp2') except OSError: pass try: os.remove('tmp/UInt16_big_out.jp2.aux.xml') except OSError: pass try: os.remove('tmp/UInt16_big_out.ecw.aux.xml') except OSError: pass try: os.remove('tmp/jrc312.ecw') except OSError: pass try: os.remove('tmp/jrc123.ecw') except OSError: pass try: os.remove('tmp/jrcstats.ecw') except OSError: pass if hasattr(gdaltest, 'ecw_38_fname'): gdal.Unlink(gdaltest.ecw_38_fname) gdal.Unlink(gdaltest.ecw_38_fname + ".aux.xml") try: os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw') except OSError: pass ############################################################################### # Verify various information about our test image. def test_ecw_2(): ds = gdal.Open('data/ecw/jrc.ecw') if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (141.172, 67.3636) else: if gdaltest.ecw_drv.major_version == 5: (exp_mean, exp_stddev) = (141.606, 67.2919) else: (exp_mean, exp_stddev) = (140.332, 67.611) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(467498.5, abs=0.1) and geotransform[1] == pytest.approx(16.5475, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(5077883.2825, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-16.5475, abs=0.001), \ 'geotransform differs from expected' ############################################################################### # Verify various information about our generated image. def test_ecw_4(): if not has_write_support(): pytest.skip() src_ds = gdal.Open('data/ecw/jrc.ecw') gdaltest.ecw_drv.CreateCopy('tmp/jrc_out.ecw', src_ds, options=['TARGET=75']) gdal.Unlink('tmp/jrc_out.ecw.aux.xml') ds = gdal.Open('tmp/jrc_out.ecw') version = ds.GetMetadataItem('VERSION') assert version == '2', 'bad VERSION' if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (140.290, 66.6303) else: if gdaltest.ecw_drv.major_version == 5: (exp_mean, exp_stddev) = (141.517, 67.1285) else: (exp_mean, exp_stddev) = (138.971, 67.716) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=1.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(467498.5, abs=0.1) and geotransform[1] == pytest.approx(16.5475, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(5077883.2825, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-16.5475, abs=0.001), \ 'geotransform differs from expected' ds = None ############################################################################### # Now try writing a JPEG2000 compressed version of the same with the ECW driver def test_ecw_5(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('data/small.vrt') ds_out = gdaltest.jp2ecw_drv.CreateCopy('tmp/ecw_5.jp2', ds, options=['TARGET=75']) assert ds_out.GetDriver().ShortName == "JP2ECW" version = ds_out.GetMetadataItem('VERSION') assert version == '1', 'bad VERSION' ds = None ############################################################################### # Verify various information about our generated image. def test_ecw_6(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('tmp/ecw_5.jp2') if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (144.422, 44.9075) else: (exp_mean, exp_stddev) = (143.375, 44.8539) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() # The difference in the stddev is outrageously large between win32 and # Linux, but I don't know why. assert mean == pytest.approx(exp_mean, abs=1.5) and stddev == pytest.approx(exp_stddev, abs=6), \ ('mean/stddev of (%g,%g) diffs from ' 'expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) (mean, stddev) = ds.GetRasterBand(2).ComputeBandStats() # The difference in the stddev is outrageously large between win32 and # Linux, but I don't know why. assert mean == pytest.approx(exp_mean, abs=1.0) and stddev == pytest.approx(exp_stddev, abs=6), \ ('mean/stddev of (%g,%g) diffs from ' 'expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ 'geotransform differs from expected' prj = ds.GetProjectionRef() assert (not (prj.find('UTM') == -1 or prj.find('NAD27') == -1 \ or prj.find('one 11') == -1)), 'Coordinate system not UTM 11, NAD27?' ds = None ############################################################################### # Write the same image to NITF. def test_ecw_7(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('data/small.vrt') drv = gdal.GetDriverByName('NITF') drv.CreateCopy('tmp/ecw_7.ntf', ds, options=['IC=C8', 'TARGET=75'], strict=0) ds = None ############################################################################### # Verify various information about our generated image. def test_ecw_8(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('tmp/ecw_7.ntf') (exp_mean, exp_stddev) = (145.57, 43.1712) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=1.0) and stddev == pytest.approx(exp_stddev, abs=1.0), \ ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ 'geotransform differs from expected' prj = ds.GetProjectionRef() assert prj.find('PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0]') == -1 or prj.find('WGS 84') > 0, \ 'Coordinate system not UTM 11, WGS 84?' ds = None ############################################################################### # Try writing 16bit JP2 file directly using Create(). def test_ecw_9(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() # This always crashes on Frank's machine - some bug in old sdk. if os.getenv('USER') == 'warmerda' and gdaltest.ecw_drv.major_version == 3: pytest.skip() ds = gdaltest.jp2ecw_drv.Create('tmp/ecw9.jp2', 200, 100, 1, gdal.GDT_Int16, options=['TARGET=75']) ds.SetGeoTransform((100, 0.1, 0.0, 30.0, 0.0, -0.1)) ds.SetProjection('GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]') raw_data = array.array('h', list(range(200))).tostring() for line in range(100): ds.WriteRaster(0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16) ds = None ############################################################################### # Verify previous 16bit file. def test_ecw_10(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() # This always crashes on Frank's machine - some bug in old sdk. if os.getenv('USER') == 'warmerda' and gdaltest.ecw_drv.major_version == 3: pytest.skip() ds = gdal.Open('tmp/ecw9.jp2') (exp_mean, exp_stddev) = (98.49, 57.7129) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=1.1) and stddev == pytest.approx(exp_stddev, abs=0.1), \ ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(100, abs=0.1) and geotransform[1] == pytest.approx(0.1, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(30, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-0.1, abs=0.001), \ 'geotransform differs from expected' ############################################################################### # Test direct creation of an NITF/JPEG2000 file. def test_ecw_11(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() drv = gdal.GetDriverByName('NITF') ds = drv.Create('tmp/test_11.ntf', 200, 100, 3, gdal.GDT_Byte, ['ICORDS=G']) ds.SetGeoTransform((100, 0.1, 0.0, 30.0, 0.0, -0.1)) my_list = list(range(200)) + list(range(20, 220)) + list(range(30, 230)) raw_data = array.array('h', my_list).tostring() for line in range(100): ds.WriteRaster(0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1, 2, 3]) ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_BlueBand) ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetRasterColorInterpretation(gdal.GCI_RedBand) ds = None ############################################################################### # Verify previous file def test_ecw_12(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('tmp/test_11.ntf') geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(100, abs=0.1) and geotransform[1] == pytest.approx(0.1, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(30.0, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-0.1, abs=0.001), \ 'geotransform differs from expected' assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ 'Got wrong color interpretation.' assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ 'Got wrong color interpretation.' assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ 'Got wrong color interpretation.' ds = None ############################################################################### # This is intended to verify that the ECWDataset::RasterIO() special case # works properly. It is used to copy subwindow into a memory dataset # which we then checksum. To stress the RasterIO(), we also change data # type and select an altered band list. def test_ecw_13(): if gdaltest.jp2ecw_drv is None: pytest.skip() ds = gdal.Open('data/jpeg2000/rgb16_ecwsdk.jp2') wrktype = gdal.GDT_Float32 raw_data = ds.ReadRaster(10, 10, 40, 40, buf_type=wrktype, band_list=[3, 2, 1]) ds = None drv = gdal.GetDriverByName('MEM') ds = drv.Create('workdata', 40, 40, 3, wrktype) ds.WriteRaster(0, 0, 40, 40, raw_data, buf_type=wrktype) checksums = (ds.GetRasterBand(1).Checksum(), ds.GetRasterBand(2).Checksum(), ds.GetRasterBand(3).Checksum()) ds = None assert checksums == (19253, 17848, 19127), \ 'Expected checksums do match expected checksums' ############################################################################### # Write out image with GCPs. def test_ecw_14(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('data/rgb_gcp.vrt') gdaltest.jp2ecw_drv.CreateCopy('tmp/rgb_gcp.jp2', ds) ds = None ############################################################################### # Verify various information about our generated image. def test_ecw_15(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('tmp/rgb_gcp.jp2') gcp_srs = ds.GetGCPProjection() assert (not (gcp_srs[:6] != 'GEOGCS' \ or gcp_srs.find('WGS') == -1 \ or gcp_srs.find('84') == -1)), 'GCP Projection not retained.' gcps = ds.GetGCPs() assert len(gcps) == 4 and gcps[1].GCPPixel == 0 and gcps[1].GCPLine == 50 and gcps[1].GCPX == 0 and gcps[1].GCPY == 50 and gcps[1].GCPZ == 0, \ 'GCPs wrong.' ds = None ############################################################################### # Open byte.jp2 def test_ecw_16(): if gdaltest.jp2ecw_drv is None: pytest.skip() srs = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26711"]] """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('JP2ECW', 'jpeg2000/byte.jp2', 1, 50054) return tst.testOpen(check_prj=srs, check_gt=gt) ############################################################################### # Open int16.jp2 def test_ecw_17(): if gdaltest.jp2ecw_drv is None: pytest.skip() if gdaltest.ecw_drv.major_version == 4: pytest.skip('4.x SDK gets unreliable results for jp2') ds = gdal.Open('data/jpeg2000/int16.jp2') ds_ref = gdal.Open('data/int16.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref) ds = None ds_ref = None # Quite a bit of difference... assert maxdiff <= 6, 'Image too different from reference' ############################################################################### # Open byte.jp2.gz (test use of the VSIL API) def test_ecw_18(): if gdaltest.jp2ecw_drv is None: pytest.skip() srs = """PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", SPHEROID["Clarke 1866",6378206.4,294.9786982138982, AUTHORITY["EPSG","7008"]], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4267"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-117], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","26711"]] """ gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) tst = gdaltest.GDALTest('JP2ECW', '/vsigzip/data/jpeg2000/byte.jp2.gz', 1, 50054, filename_absolute=1) ret = tst.testOpen(check_prj=srs, check_gt=gt) gdal.Unlink('data/jpeg2000/byte.jp2.gz.properties') return ret ############################################################################### # Test a JPEG2000 with the 3 bands having 13bit depth and the 4th one 1 bit def test_ecw_19(): if gdaltest.jp2ecw_drv is None: pytest.skip() ds = gdal.Open('data/jpeg2000/3_13bit_and_1bit.jp2') expected_checksums = [64570, 57277, 56048, 61292] for i in range(4): assert ds.GetRasterBand(i + 1).Checksum() == expected_checksums[i], \ ('unexpected checksum (%d) for band %d' % (expected_checksums[i], i + 1)) assert ds.GetRasterBand(1).DataType == gdal.GDT_UInt16, 'unexpected data type' ############################################################################### # Confirm that we have an overview for this image and that the statistics # are as expected. def test_ecw_20(): ds = gdal.Open('data/ecw/jrc.ecw') band = ds.GetRasterBand(1) assert band.GetOverviewCount() == 1, 'did not get expected number of overview' # Both requests should go *exactly* to the same code path data_subsampled = band.ReadRaster(0, 0, 400, 400, 200, 200) data_overview = band.GetOverview(0).ReadRaster(0, 0, 200, 200) assert data_subsampled == data_overview, 'inconsistent overview behaviour' if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (141.644, 67.2186) else: if gdaltest.ecw_drv.major_version == 5: (exp_mean, exp_stddev) = (142.189, 62.4223) else: (exp_mean, exp_stddev) = (140.889, 62.742) (mean, stddev) = band.GetOverview(0).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ ('mean/stddev of (%g,%g) diffs from ' 'expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) ############################################################################### # This test is intended to go through an optimized data path (likely # one big interleaved read) in the CreateCopy() instead of the line by # line access typical of ComputeBandStats. Make sure we get the same as # line by line. def test_ecw_21(): ds = gdal.Open('data/ecw/jrc.ecw') mem_ds = gdal.GetDriverByName('MEM').CreateCopy('xxxyyy', ds, options=['INTERLEAVE=PIXEL']) ds = None if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (141.172, 67.3636) else: if gdaltest.ecw_drv.major_version == 5: (exp_mean, exp_stddev) = (141.606, 67.2919) else: (exp_mean, exp_stddev) = (140.332, 67.611) (mean, stddev) = mem_ds.GetRasterBand(1).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=0.5) and stddev == pytest.approx(exp_stddev, abs=0.5), \ ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) ############################################################################### # This tests reading of georeferencing and coordinate system from within an # ECW file. def test_ecw_22(): ds = gdal.Open('data/ecw/spif83.ecw') expected_wkt = """PROJCS["L2CAL6M",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",32.7833333078095],PARAMETER["standard_parallel_2",33.8833333208765],PARAMETER["latitude_of_origin",32.166666682432],PARAMETER["central_meridian",-116.249999974595],PARAMETER["false_easting",2000000],PARAMETER["false_northing",500000],UNIT["Metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]""" wkt = ds.GetProjectionRef() assert wkt == expected_wkt, 'did not get expected SRS.' ############################################################################### # This tests overriding the coordinate system from an .aux.xml file, while # preserving the ecw derived georeferencing. def test_ecw_23(): shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') shutil.copyfile('data/ecw/spif83_hidden.ecw.aux.xml', 'tmp/spif83.ecw.aux.xml') ds = gdal.Open('tmp/spif83.ecw') expected_wkt = """PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB_1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-20.489],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27700"]]""" wkt = ds.GetProjectionRef() assert wkt == expected_wkt, 'did not get expected SRS.' gt = ds.GetGeoTransform() expected_gt = (6138559.5576418638, 195.5116973254697, 0.0, 2274798.7836679211, 0.0, -198.32414964918371) assert gt == expected_gt, 'did not get expected geotransform.' try: os.remove('tmp/spif83.ecw') os.remove('tmp/spif83.ecw.aux.xml') except OSError: pass ############################################################################### # Test that we can alter geotransform on existing ECW def test_ecw_24(): shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') try: os.remove('tmp/spif83.ecw.aux.xml') except OSError: pass ds = gdal.Open('tmp/spif83.ecw', gdal.GA_Update) if ds is None and gdaltest.ecw_drv.major_version == 3 and gdal.GetConfigOption('APPVEYOR') is not None: try: os.remove('tmp/spif83.ecw') except OSError: pass pytest.skip() gt = [1, 2, 0, 3, 0, -4] ds.SetGeoTransform(gt) ds = None with pytest.raises(OSError): os.stat('tmp/spif83.ecw.aux.xml') ds = gdal.Open('tmp/spif83.ecw') got_gt = ds.GetGeoTransform() ds = None for i in range(6): assert gt[i] == pytest.approx(got_gt[i], abs=1e-5) try: os.remove('tmp/spif83.ecw') except OSError: pass ############################################################################### # Test that we can alter projection info on existing ECW (through SetProjection()) def test_ecw_25(): shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') try: os.remove('tmp/spif83.ecw.aux.xml') except OSError: pass proj = 'NUTM31' datum = 'WGS84' units = 'FEET' ds = gdal.Open('tmp/spif83.ecw', gdal.GA_Update) if ds is None and gdaltest.ecw_drv.major_version == 3 and gdal.GetConfigOption('APPVEYOR') is not None: try: os.remove('tmp/spif83.ecw') except OSError: pass pytest.skip() sr = osr.SpatialReference() sr.ImportFromERM(proj, datum, units) wkt = sr.ExportToWkt() ds.SetProjection(wkt) ds = None with pytest.raises(OSError): os.stat('tmp/spif83.ecw.aux.xml') ds = gdal.Open('tmp/spif83.ecw') got_proj = ds.GetMetadataItem("PROJ", "ECW") got_datum = ds.GetMetadataItem("DATUM", "ECW") got_units = ds.GetMetadataItem("UNITS", "ECW") got_wkt = ds.GetProjectionRef() ds = None assert got_proj == proj assert got_datum == datum assert got_units == units assert wkt == got_wkt try: os.remove('tmp/spif83.ecw') except OSError: pass ############################################################################### # Test that we can alter projection info on existing ECW (through SetMetadataItem()) def test_ecw_26(): shutil.copyfile('data/ecw/spif83.ecw', 'tmp/spif83.ecw') try: os.remove('tmp/spif83.ecw.aux.xml') except OSError: pass proj = 'NUTM31' datum = 'WGS84' units = 'FEET' ds = gdal.Open('tmp/spif83.ecw', gdal.GA_Update) if ds is None and gdaltest.ecw_drv.major_version == 3 and gdal.GetConfigOption('APPVEYOR') is not None: try: os.remove('tmp/spif83.ecw') except OSError: pass pytest.skip() ds.SetMetadataItem("PROJ", proj, "ECW") ds.SetMetadataItem("DATUM", datum, "ECW") ds.SetMetadataItem("UNITS", units, "ECW") ds = None with pytest.raises(OSError): os.stat('tmp/spif83.ecw.aux.xml') ds = gdal.Open('tmp/spif83.ecw') got_proj = ds.GetMetadataItem("PROJ", "ECW") got_datum = ds.GetMetadataItem("DATUM", "ECW") got_units = ds.GetMetadataItem("UNITS", "ECW") got_wkt = ds.GetProjectionRef() ds = None assert got_proj == proj assert got_datum == datum assert got_units == units sr = osr.SpatialReference() sr.ImportFromERM(proj, datum, units) wkt = sr.ExportToWkt() assert wkt == got_wkt try: os.remove('tmp/spif83.ecw') except OSError: pass ############################################################################### # Check that we can use .j2w world files (#4651) def test_ecw_27(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.Open('data/jpeg2000/byte_without_geotransform.jp2') geotransform = ds.GetGeoTransform() assert geotransform[0] == pytest.approx(440720, abs=0.1) and geotransform[1] == pytest.approx(60, abs=0.001) and geotransform[2] == pytest.approx(0, abs=0.001) and geotransform[3] == pytest.approx(3751320, abs=0.1) and geotransform[4] == pytest.approx(0, abs=0.001) and geotransform[5] == pytest.approx(-60, abs=0.001), \ 'geotransform differs from expected' ds = None ############################################################################### # Check picking use case def test_ecw_28(): x = y = 50 ds = gdal.Open('data/ecw/jrc.ecw') multiband_data = ds.ReadRaster(x, y, 1, 1) ds = None ds = gdal.Open('data/ecw/jrc.ecw') data1 = ds.GetRasterBand(1).ReadRaster(x, y, 1, 1) data2 = ds.GetRasterBand(2).ReadRaster(x, y, 1, 1) data3 = ds.GetRasterBand(3).ReadRaster(x, y, 1, 1) ds = None import struct struct.unpack('B' * 3, multiband_data) struct.unpack('B' * 3, data1 + data2 + data3) ############################################################################### # Test supersampling def test_ecw_29(): ds = gdal.Open('data/ecw/jrc.ecw') data_b1 = ds.GetRasterBand(1).ReadRaster(0, 0, 400, 400) ds = None ds = gdal.Open('data/ecw/jrc.ecw') data_ecw_supersampled_b1 = ds.GetRasterBand(1).ReadRaster(0, 0, 400, 400, 800, 800) ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ecw_29_0.tif', 400, 400, 1) ds.WriteRaster(0, 0, 400, 400, data_b1) data_tiff_supersampled_b1 = ds.GetRasterBand(1).ReadRaster(0, 0, 400, 400, 800, 800) ds = None ds1 = gdal.GetDriverByName('GTiff').Create('/vsimem/ecw_29_1.tif', 800, 800, 1) ds1.WriteRaster(0, 0, 800, 800, data_ecw_supersampled_b1) ds2 = gdal.GetDriverByName('GTiff').Create('/vsimem/ecw_29_2.tif', 800, 800, 1) ds2.WriteRaster(0, 0, 800, 800, data_tiff_supersampled_b1) ret = 'success' if gdaltest.ecw_drv.major_version < 5: maxdiff = gdaltest.compare_ds(ds1, ds2) if maxdiff != 0: print(maxdiff) ret = 'fail' else: # Compare the images by comparing their statistics on subwindows nvals = 0 sum_abs_diff_mean = 0 sum_abs_diff_stddev = 0 tile = 32 for j in range(2 * int((ds1.RasterYSize - tile / 2) / tile)): for i in range(2 * int((ds1.RasterXSize - tile / 2) / tile)): tmp_ds1 = gdal.GetDriverByName('MEM').Create('', tile, tile, 1) tmp_ds2 = gdal.GetDriverByName('MEM').Create('', tile, tile, 1) data1 = ds1.ReadRaster(i * int(tile / 2), j * int(tile / 2), tile, tile) data2 = ds2.ReadRaster(i * int(tile / 2), j * int(tile / 2), tile, tile) tmp_ds1.WriteRaster(0, 0, tile, tile, data1) tmp_ds2.WriteRaster(0, 0, tile, tile, data2) (_, _, mean1, stddev1) = tmp_ds1.GetRasterBand(1).GetStatistics(1, 1) (_, _, mean2, stddev2) = tmp_ds2.GetRasterBand(1).GetStatistics(1, 1) nvals = nvals + 1 sum_abs_diff_mean = sum_abs_diff_mean + abs(mean1 - mean2) sum_abs_diff_stddev = sum_abs_diff_stddev + abs(stddev1 - stddev2) if mean1 != pytest.approx(mean2, abs=(stddev1 + stddev2) / 2) or stddev1 != pytest.approx(stddev2, abs=30): print("%d, %d, %f, %f" % (j, i, abs(mean1 - mean2), abs(stddev1 - stddev2))) ret = 'fail' if sum_abs_diff_mean / nvals > 4 or sum_abs_diff_stddev / nvals > 3: print(sum_abs_diff_mean / nvals) print(sum_abs_diff_stddev / nvals) ret = 'fail' ds1 = None ds2 = None gdal.Unlink('/vsimem/ecw_29_0.tif') gdal.Unlink('/vsimem/ecw_29_1.tif') gdal.Unlink('/vsimem/ecw_29_2.tif') return ret ############################################################################### # Test IReadBlock() def test_ecw_30(): ds = gdal.Open('data/ecw/jrc.ecw') (blockxsize, blockysize) = ds.GetRasterBand(1).GetBlockSize() data_readraster = ds.GetRasterBand(1).ReadRaster(0, 0, blockxsize, blockysize) data_readblock = ds.GetRasterBand(1).ReadBlock(0, 0) ds = None assert data_readraster == data_readblock ############################################################################### # Test async reader interface ( SDK >= 4.x ) def test_ecw_31(): if gdaltest.ecw_drv.major_version < 4: pytest.skip() ds = gdal.Open('data/ecw/jrc.ecw') ref_buf = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) ds = None ds = gdal.Open('data/ecw/jrc.ecw') asyncreader = ds.BeginAsyncReader(0, 0, ds.RasterXSize, ds.RasterYSize) while True: result = asyncreader.GetNextUpdatedRegion(0.05) if result[0] == gdal.GARIO_COMPLETE: break elif result[0] != gdal.GARIO_ERROR: continue else: ds.EndAsyncReader(asyncreader) pytest.fail('error occurred') if result != [gdal.GARIO_COMPLETE, 0, 0, ds.RasterXSize, ds.RasterYSize]: print(result) ds.EndAsyncReader(asyncreader) pytest.fail('wrong return values for GetNextUpdatedRegion()') async_buf = asyncreader.GetBuffer() ds.EndAsyncReader(asyncreader) asyncreader = None ds = None assert async_buf == ref_buf, 'async_buf != ref_buf' ############################################################################### # ECW SDK 3.3 has a bug with the ECW format when we query the # number of bands of the dataset, but not in the "natural order". # It ignores the content of panBandMap. (#4234) def test_ecw_32(): ds = gdal.Open('data/ecw/jrc.ecw') data_123 = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, band_list=[1, 2, 3]) data_321 = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, band_list=[3, 2, 1]) assert data_123 != data_321 vrt_ds = gdal.Open(""" data/ecw/jrc.ecw 3 data/ecw/jrc.ecw 2 data/ecw/jrc.ecw 1 """) data_vrt = vrt_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, band_list=[1, 2, 3]) assert data_321 == data_vrt ############################################################################### # Test heuristics that detect successive band reading pattern def test_ecw_33(): ds = gdal.Open('data/ecw/jrc.ecw') multiband_data = ds.ReadRaster(100, 100, 50, 50) ds = None ds = gdal.Open('data/ecw/jrc.ecw') # To feed the heuristics ds.GetRasterBand(1).ReadRaster(10, 10, 50, 50) ds.GetRasterBand(2).ReadRaster(10, 10, 50, 50) ds.GetRasterBand(3).ReadRaster(10, 10, 50, 50) # Now the heuristics should be set to ON data1_1 = ds.GetRasterBand(1).ReadRaster(100, 100, 50, 50) data2_1 = ds.GetRasterBand(2).ReadRaster(100, 100, 50, 50) data3_1 = ds.GetRasterBand(3).ReadRaster(100, 100, 50, 50) # Break heuristics ds.GetRasterBand(2).ReadRaster(100, 100, 50, 50) ds.GetRasterBand(1).ReadRaster(100, 100, 50, 50) # To feed the heuristics again ds.GetRasterBand(1).ReadRaster(10, 10, 50, 50) ds.GetRasterBand(2).ReadRaster(10, 10, 50, 50) ds.GetRasterBand(3).ReadRaster(10, 10, 50, 50) # Now the heuristics should be set to ON data1_2 = ds.GetRasterBand(1).ReadRaster(100, 100, 50, 50) data2_2 = ds.GetRasterBand(2).ReadRaster(100, 100, 50, 50) data3_2 = ds.GetRasterBand(3).ReadRaster(100, 100, 50, 50) ds = None assert data1_1 == data1_2 and data2_1 == data2_2 and data3_1 == data3_2 # When heuristics is ON, returned values should be the same as # 3-band at a time reading import struct tab1 = struct.unpack('B' * 3 * 50 * 50, multiband_data) tab2 = struct.unpack('B' * 3 * 50 * 50, data1_1 + data2_1 + data3_2) assert tab1 == tab2 ds = None ############################################################################### # Check bugfix for #5262 def test_ecw_33_bis(): ds = gdal.Open('data/ecw/jrc.ecw') data_ref = ds.ReadRaster(0, 0, 50, 50) ds = gdal.Open('data/ecw/jrc.ecw') # To feed the heuristics ds.GetRasterBand(1).ReadRaster(0, 0, 50, 50, buf_pixel_space=4) ds.GetRasterBand(2).ReadRaster(0, 0, 50, 50, buf_pixel_space=4) ds.GetRasterBand(3).ReadRaster(0, 0, 50, 50, buf_pixel_space=4) # Now the heuristics should be set to ON data1 = ds.GetRasterBand(1).ReadRaster(0, 0, 50, 50, buf_pixel_space=4) data2 = ds.GetRasterBand(2).ReadRaster(0, 0, 50, 50, buf_pixel_space=4) data3 = ds.GetRasterBand(3).ReadRaster(0, 0, 50, 50, buf_pixel_space=4) # Note: we must compare with the dataset RasterIO() buffer since # with SDK 3.3, the results of band RasterIO() and dataset RasterIO() are # not consistent. (which seems to be no longer the case with more recent # SDK such as 5.0) for i in range(50 * 50): assert data1[i * 4] == data_ref[i] assert data2[i * 4] == data_ref[50 * 50 + i] assert data3[i * 4] == data_ref[2 * 50 * 50 + i] ds = None ############################################################################### # Verify that an write the imagery out to a new ecw file. Source file is 16 bit. def test_ecw_34(): if not has_write_support(): pytest.skip() if gdaltest.ecw_drv.major_version < 5: pytest.skip() ds = gdal.GetDriverByName('MEM').Create('MEM:::', 128, 128, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).Fill(65535) ref_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) out_ds = gdaltest.ecw_drv.CreateCopy('tmp/UInt16_big_out.ecw', ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=1']) del out_ds ds = None ds = gdal.Open('tmp/UInt16_big_out.ecw') got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) version = ds.GetMetadataItem('VERSION') ds = None assert got_data == ref_data assert version == '3', 'bad VERSION' ############################################################################### # Verify that an write the imagery out to a new JP2 file. Source file is 16 bit. def test_ecw_35(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() ds = gdal.GetDriverByName('MEM').Create('MEM:::', 128, 128, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).Fill(65535) ref_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) out_ds = gdaltest.jp2ecw_drv.CreateCopy('tmp/UInt16_big_out.jp2', ds, options=['TARGET=1']) del out_ds ds = None ds = gdal.Open('tmp/UInt16_big_out.jp2') got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 128, 128, buf_type=gdal.GDT_UInt16) ds = None assert got_data == ref_data ############################################################################### # Make sure that band descriptions are preserved for version 3 ECW files. def test_ecw_36(): if not has_write_support(): pytest.skip() if gdaltest.ecw_drv.major_version < 5: pytest.skip() vrt_ds = gdal.Open(""" Blue data/ecw/jrc.ecw 3 Red data/ecw/jrc.ecw 1 Green data/ecw/jrc.ecw 2 """) dswr = gdaltest.ecw_drv.CreateCopy('tmp/jrc312.ecw', vrt_ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=75']) assert dswr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand, \ ('Band 1 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(1).GetColorInterpretation())) assert dswr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_RedBand, \ ('Band 2 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(2).GetColorInterpretation())) assert dswr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_GreenBand, \ ('Band 3 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(3).GetColorInterpretation())) dswr = None dsr = gdal.Open('tmp/jrc312.ecw') assert dsr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand, \ ('Band 1 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(1).GetColorInterpretation())) assert dsr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_RedBand, \ ('Band 2 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(2).GetColorInterpretation())) assert dsr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_GreenBand, \ ('Band 3 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(3).GetColorInterpretation())) dsr = None ############################################################################### # Make sure that band descriptions are preserved for version 2 ECW files when # color space set implicitly to sRGB. def test_ecw_37(): if not has_write_support(): pytest.skip() if gdaltest.ecw_drv.major_version < 5: pytest.skip() ds = gdal.Open("data/ecw/jrc.ecw") dswr = gdaltest.ecw_drv.CreateCopy('tmp/jrc123.ecw', ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=75']) assert dswr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand, \ ('Band 1 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(1).GetColorInterpretation())) assert dswr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand, \ ('Band 2 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(2).GetColorInterpretation())) assert dswr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand, \ ('Band 3 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dswr.GetRasterBand(3).GetColorInterpretation())) dswr = None dsr = gdal.Open('tmp/jrc123.ecw') assert dsr.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand, \ ('Band 1 color interpretation should be Red but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(1).GetColorInterpretation())) assert dsr.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand, \ ('Band 2 color interpretation should be Green but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(2).GetColorInterpretation())) assert dsr.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand, \ ('Band 3 color interpretation should be Blue but is : ' + gdal.GetColorInterpretationName(dsr.GetRasterBand(3).GetColorInterpretation())) dsr = None ############################################################################### # Check opening unicode files. def test_ecw_38(): gdaltest.ecw_38_fname = '' if version_info >= (3, 0, 0): exec("""gdaltest.ecw_38_fname = 'tmp/za\u017C\u00F3\u0142\u0107g\u0119\u015Bl\u0105ja\u017A\u0144.ecw'""") else: exec("""gdaltest.ecw_38_fname = u'tmp/za\u017C\u00F3\u0142\u0107g\u0119\u015Bl\u0105ja\u017A\u0144.ecw'""") fname = gdaltest.ecw_38_fname if gdaltest.ecw_drv.major_version < 4: pytest.skip() shutil.copyfile('data/ecw/jrc.ecw', fname) ds = gdal.Open('data/ecw/jrc.ecw') ds_ref = gdal.Open(fname) maxdiff = gdaltest.compare_ds(ds, ds_ref) ds = None ds_ref = None # Quite a bit of difference... assert maxdiff <= 0, 'Image too different from reference' ############################################################################### # Check writing histograms. def test_ecw_39(): if not has_write_support(): pytest.skip() if gdaltest.ecw_drv.major_version < 5: pytest.skip() ds = gdal.Open('data/ecw/jrc.ecw') dswr = gdaltest.ecw_drv.CreateCopy('tmp/jrcstats.ecw', ds, options=['ECW_FORMAT_VERSION=3', 'TARGET=75']) ds = None hist = (0, 255, 2, [3, 4]) dswr.GetRasterBand(1).SetDefaultHistogram(0, 255, [3, 4]) dswr = None ds = gdal.Open('tmp/jrcstats.ecw') result = (hist == ds.GetRasterBand(1).GetDefaultHistogram(force=0)) ds = None assert result, 'Default histogram written incorrectly' ############################################################################### # Check reading a ECW v3 file def test_ecw_40(): ds = gdal.Open('data/ecw/stefan_full_rgba_ecwv3_meta.ecw') if ds is None: if gdaltest.ecw_drv.major_version < 5: if gdal.GetLastErrorMsg().find('requires ECW SDK 5.0') >= 0: pytest.skip() pytest.fail('explicit error message expected') pytest.fail() expected_md = [ ('CLOCKWISE_ROTATION_DEG', '0.000000'), ('COLORSPACE', 'RGB'), ('COMPRESSION_DATE', '2013-04-04T09:20:03Z'), ('COMPRESSION_RATE_ACTUAL', '3.165093'), ('COMPRESSION_RATE_TARGET', '20'), ('FILE_METADATA_COMPRESSION_SOFTWARE', 'python2.7/GDAL v1.10.0.0/ECWJP2 SDK v5.0.0.0'), ('FILE_METADATA_ACQUISITION_DATE', '2012-09-12'), ('FILE_METADATA_ACQUISITION_SENSOR_NAME', 'Leica ADS-80'), ('FILE_METADATA_ADDRESS', '2 Abbotsford Street, West Leederville WA 6007 Australia'), ('FILE_METADATA_AUTHOR', 'Unknown'), ('FILE_METADATA_CLASSIFICATION', 'test gdal image'), ('FILE_METADATA_COMPANY', 'ERDAS-QA'), ('FILE_METADATA_COMPRESSION_SOFTWARE', 'python2.7/GDAL v1.10.0.0/ECWJP2 SDK v5.0.0.0'), ('FILE_METADATA_COPYRIGHT', 'Intergraph 2013'), ('FILE_METADATA_EMAIL', 'support@intergraph.com'), ('FILE_METADATA_TELEPHONE', '+61 8 9388 2900'), ('VERSION', '3')] got_md = ds.GetMetadata() for (key, value) in expected_md: assert key in got_md and got_md[key] == value expected_cs_list = [28760, 59071, 54087, 22499] for i in range(4): got_cs = ds.GetRasterBand(i + 1).Checksum() assert got_cs == expected_cs_list[i] ############################################################################### # Check generating statistics & histogram for a ECW v3 file def test_ecw_41(): if gdaltest.ecw_drv.major_version < 5: pytest.skip() shutil.copy('data/ecw/stefan_full_rgba_ecwv3_meta.ecw', 'tmp/stefan_full_rgba_ecwv3_meta.ecw') try: os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') except OSError: pass ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') # Check that no statistics is already included in the file assert ds.GetRasterBand(1).GetMinimum() is None assert ds.GetRasterBand(1).GetMaximum() is None assert ds.GetRasterBand(1).GetStatistics(1, 0) == [0.0, 0.0, 0.0, -1.0] assert ds.GetRasterBand(1).GetDefaultHistogram(force=0) is None # Now compute the stats stats = ds.GetRasterBand(1).GetStatistics(0, 1) expected_stats = [0.0, 255.0, 21.662427983539093, 51.789457392268119] for i in range(4): assert stats[i] == pytest.approx(expected_stats[i], abs=1) ds = None # Check that there's no .aux.xml file with pytest.raises(OSError): os.stat('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') assert ds.GetRasterBand(1).GetMinimum() == 0 assert ds.GetRasterBand(1).GetMaximum() == 255 stats = ds.GetRasterBand(1).GetStatistics(0, 0) expected_stats = [0.0, 255.0, 21.662427983539093, 51.789457392268119] for i in range(4): assert stats[i] == pytest.approx(expected_stats[i], abs=1) ds = None ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') # And compute the histogram got_hist = ds.GetRasterBand(1).GetDefaultHistogram() expected_hist = (-0.5, 255.5, 256, [1006, 16106, 548, 99, 13, 24, 62, 118, 58, 125, 162, 180, 133, 146, 70, 81, 84, 97, 90, 60, 79, 70, 85, 77, 73, 63, 60, 64, 56, 69, 63, 73, 70, 72, 61, 66, 40, 52, 65, 44, 62, 54, 56, 55, 63, 51, 47, 39, 58, 44, 36, 43, 47, 45, 54, 28, 40, 41, 37, 36, 33, 31, 28, 34, 19, 32, 19, 23, 23, 33, 16, 34, 32, 54, 29, 33, 40, 37, 27, 34, 24, 29, 26, 21, 22, 24, 25, 19, 29, 22, 24, 14, 20, 20, 29, 28, 13, 19, 21, 19, 19, 21, 13, 19, 13, 14, 22, 15, 13, 26, 10, 13, 13, 14, 10, 17, 15, 19, 11, 18, 11, 14, 8, 12, 20, 12, 17, 10, 15, 15, 16, 14, 11, 7, 7, 10, 8, 12, 7, 8, 14, 7, 9, 12, 4, 6, 12, 5, 5, 4, 11, 8, 4, 8, 7, 10, 11, 6, 7, 5, 6, 8, 10, 10, 7, 5, 3, 5, 5, 6, 4, 10, 7, 6, 8, 4, 6, 6, 4, 6, 6, 7, 10, 4, 5, 2, 5, 6, 1, 1, 2, 6, 2, 1, 7, 4, 1, 3, 3, 2, 6, 2, 3, 3, 3, 3, 5, 5, 4, 2, 3, 2, 1, 3, 5, 5, 4, 1, 1, 2, 5, 10, 5, 9, 3, 5, 3, 5, 4, 5, 4, 4, 6, 7, 9, 17, 13, 15, 14, 13, 20, 18, 16, 27, 35, 53, 60, 51, 46, 40, 38, 50, 66, 36, 45, 13]) assert got_hist == expected_hist ds = None # Remove the .aux.xml file try: os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') except OSError: pass ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') assert ds.GetRasterBand(1).GetMinimum() == 0 assert ds.GetRasterBand(1).GetMaximum() == 255 got_hist = ds.GetRasterBand(1).GetDefaultHistogram(force=0) assert got_hist == expected_hist ds = None # Check that there's no .aux.xml file with pytest.raises(OSError): os.stat('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') ############################################################################### # Test setting/unsetting file metadata of a ECW v3 file def test_ecw_42(): if gdaltest.ecw_drv.major_version < 5: pytest.skip() shutil.copy('data/ecw/stefan_full_rgba_ecwv3_meta.ecw', 'tmp/stefan_full_rgba_ecwv3_meta.ecw') try: os.remove('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') except OSError: pass ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw', gdal.GA_Update) md = {} md['FILE_METADATA_CLASSIFICATION'] = 'FILE_METADATA_CLASSIFICATION' md['FILE_METADATA_ACQUISITION_DATE'] = '2013-04-04' md['FILE_METADATA_ACQUISITION_SENSOR_NAME'] = 'FILE_METADATA_ACQUISITION_SENSOR_NAME' md['FILE_METADATA_COMPRESSION_SOFTWARE'] = 'FILE_METADATA_COMPRESSION_SOFTWARE' md['FILE_METADATA_AUTHOR'] = 'FILE_METADATA_AUTHOR' md['FILE_METADATA_COPYRIGHT'] = 'FILE_METADATA_COPYRIGHT' md['FILE_METADATA_COMPANY'] = 'FILE_METADATA_COMPANY' md['FILE_METADATA_EMAIL'] = 'FILE_METADATA_EMAIL' md['FILE_METADATA_ADDRESS'] = 'FILE_METADATA_ADDRESS' md['FILE_METADATA_TELEPHONE'] = 'FILE_METADATA_TELEPHONE' ds.SetMetadata(md) ds = None # Check that there's no .aux.xml file with pytest.raises(OSError): os.stat('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') # Check item values ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') got_md = ds.GetMetadata() for item in md: assert got_md[item] == md[item] ds = None # Test unsetting all the stuff ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw', gdal.GA_Update) md = {} md['FILE_METADATA_CLASSIFICATION'] = '' md['FILE_METADATA_ACQUISITION_DATE'] = '1970-01-01' md['FILE_METADATA_ACQUISITION_SENSOR_NAME'] = '' md['FILE_METADATA_COMPRESSION_SOFTWARE'] = '' md['FILE_METADATA_AUTHOR'] = '' md['FILE_METADATA_COPYRIGHT'] = '' md['FILE_METADATA_COMPANY'] = '' md['FILE_METADATA_EMAIL'] = '' md['FILE_METADATA_ADDRESS'] = '' md['FILE_METADATA_TELEPHONE'] = '' ds.SetMetadata(md) ds = None # Check that there's no .aux.xml file with pytest.raises(OSError): os.stat('tmp/stefan_full_rgba_ecwv3_meta.ecw.aux.xml') # Check item values ds = gdal.Open('tmp/stefan_full_rgba_ecwv3_meta.ecw') got_md = ds.GetMetadata() for item in md: assert item not in got_md or item == 'FILE_METADATA_ACQUISITION_DATE', md[item] ds = None ############################################################################### # Test auto-promotion of 1bit alpha band to 8bit # Note: only works on reversible files like this one def test_ecw_43(): if gdaltest.jp2ecw_drv is None: pytest.skip() ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') is None got_cs = fourth_band.Checksum() assert got_cs == 8527 jp2_bands_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) jp2_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, int(ds.RasterXSize / 16), int(ds.RasterYSize / 16)) tmp_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/ecw_43.tif', ds) fourth_band = tmp_ds.GetRasterBand(4) got_cs = fourth_band.Checksum() gtiff_bands_data = tmp_ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) gtiff_fourth_band_data = fourth_band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize) # gtiff_fourth_band_subsampled_data = fourth_band.ReadRaster(0,0,ds.RasterXSize,ds.RasterYSize,ds.RasterXSize/16,ds.RasterYSize/16) tmp_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/ecw_43.tif') assert got_cs == 8527 assert jp2_bands_data == gtiff_bands_data assert jp2_fourth_band_data == gtiff_fourth_band_data ds = gdal.OpenEx('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2', open_options=['1BIT_ALPHA_PROMOTION=NO']) fourth_band = ds.GetRasterBand(4) assert fourth_band.GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ############################################################################### # Test metadata retrieval from JP2 file def test_ecw_44(): if gdaltest.jp2ecw_drv is None: pytest.skip() if gdaltest.ecw_drv.major_version < 5 or (gdaltest.ecw_drv.major_version == 5 and gdaltest.ecw_drv.minor_version < 1): pytest.skip() ds = gdal.Open('data/jpeg2000/stefan_full_rgba_alpha_1bit.jp2') expected_md = [ ('CODE_BLOCK_SIZE_X', '64'), ('CODE_BLOCK_SIZE_Y', '64'), ('GML_JP2_DATA', 'FALSE'), ('PRECINCT_SIZE_X', '128,128'), ('PRECINCT_SIZE_Y', '128,128'), ('PRECISION', '8,8,8,1'), ('PROFILE', '0'), ('PROGRESSION_ORDER', 'RPCL'), ('QUALITY_LAYERS', '1'), ('RESOLUTION_LEVELS', '2'), ('PROGRESSION_ORDER', 'RPCL'), ('TILE_HEIGHT', '150'), ('TILE_WIDTH', '162'), ('TILES_X', '1'), ('TILES_Y', '1'), ('TRANSFORMATION_TYPE', '5x3'), ('USE_EPH', 'TRUE'), ('USE_SOP', 'FALSE')] got_md = ds.GetMetadata('JPEG2000') for (key, value) in expected_md: assert key in got_md and got_md[key] == value ############################################################################### # Test metadata reading & writing def RemoveDriverMetadata(md): if 'COMPRESSION_RATE_TARGET' in md: del md['COMPRESSION_RATE_TARGET'] if 'COLORSPACE' in md: del md['COLORSPACE'] if 'VERSION' in md: del md['VERSION'] return md def test_ecw_45(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() # No metadata src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=['WRITE_METADATA=YES']) del out_ds assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None ds = gdal.Open('/vsimem/ecw_45.jp2') md = RemoveDriverMetadata(ds.GetMetadata()) assert md == {} gdal.Unlink('/vsimem/ecw_45.jp2') # Simple metadata in main domain for options in [['WRITE_METADATA=YES']]: src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadataItem('FOO', 'BAR') out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=options) del out_ds assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None ds = gdal.Open('/vsimem/ecw_45.jp2') md = RemoveDriverMetadata(ds.GetMetadata()) assert md == {'FOO': 'BAR'} gdal.Unlink('/vsimem/ecw_45.jp2') # Simple metadata in auxiliary domain src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadataItem('FOO', 'BAR', 'SOME_DOMAIN') out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=['WRITE_METADATA=YES']) del out_ds assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None ds = gdal.Open('/vsimem/ecw_45.jp2') md = RemoveDriverMetadata(ds.GetMetadata('SOME_DOMAIN')) assert md == {'FOO': 'BAR'} gdal.Unlink('/vsimem/ecw_45.jp2') # Simple metadata in auxiliary XML domain src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadata([''], 'xml:SOME_DOMAIN') out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=['WRITE_METADATA=YES']) del out_ds assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None ds = gdal.Open('/vsimem/ecw_45.jp2') assert ds.GetMetadata('xml:SOME_DOMAIN')[0] == '\n' gdal.Unlink('/vsimem/ecw_45.jp2') # Special xml:BOX_ metadata domain for options in [['WRITE_METADATA=YES']]: src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadata([''], 'xml:BOX_1') out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=options) del out_ds assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None ds = gdal.Open('/vsimem/ecw_45.jp2') assert ds.GetMetadata('xml:BOX_0')[0] == '' gdal.Unlink('/vsimem/ecw_45.jp2') # Special xml:XMP metadata domain for options in [['WRITE_METADATA=YES']]: src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetMetadata([''], 'xml:XMP') out_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_45.jp2', src_ds, options=options) del out_ds assert gdal.VSIStatL('/vsimem/ecw_45.jp2.aux.xml') is None ds = gdal.Open('/vsimem/ecw_45.jp2') assert ds.GetMetadata('xml:XMP')[0] == '' gdal.Unlink('/vsimem/ecw_45.jp2') ############################################################################### # Test non nearest upsampling def test_ecw_46(): if gdaltest.jp2ecw_drv is None or not has_write_support(): pytest.skip() tmp_ds = gdaltest.jp2ecw_drv.CreateCopy('/vsimem/ecw_46.jp2', gdal.Open('data/int16.tif')) tmp_ds = None tmp_ds = gdal.Open('/vsimem/ecw_46.jp2') full_res_data = tmp_ds.ReadRaster(0, 0, 20, 20) upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic) tmp_ds = None gdal.Unlink('/vsimem/ecw_46.jp2') tmp_ds = gdal.GetDriverByName('MEM').Create('', 20, 20, 1, gdal.GDT_Int16) tmp_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, full_res_data) ref_upsampled_data = tmp_ds.ReadRaster(0, 0, 20, 20, 40, 40, resample_alg=gdal.GRIORA_Cubic) mem_ds = gdal.GetDriverByName('MEM').Create('', 40, 40, 1, gdal.GDT_Int16) mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, ref_upsampled_data) ref_cs = mem_ds.GetRasterBand(1).Checksum() mem_ds.GetRasterBand(1).WriteRaster(0, 0, 40, 40, upsampled_data) cs = mem_ds.GetRasterBand(1).Checksum() assert cs == ref_cs ############################################################################### # /vsi reading with ECW (#6482) def test_ecw_47(): if gdaltest.ecw_drv.major_version == 3: pytest.skip() data = open('data/ecw/jrc.ecw', 'rb').read() gdal.FileFromMemBuffer('/vsimem/ecw_47.ecw', data) ds = gdal.Open('/vsimem/ecw_47.ecw') assert ds is not None mean_tolerance = 0.5 if gdaltest.ecw_drv.major_version == 5: (exp_mean, exp_stddev) = (141.606, 67.2919) else: (exp_mean, exp_stddev) = (140.332, 67.611) (mean, stddev) = ds.GetRasterBand(1).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=mean_tolerance) and stddev == pytest.approx(exp_stddev, abs=0.5), \ ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) gdal.Unlink('/vsimem/ecw_47.ecw') ############################################################################### # Test "Upward" orientation is forced by default def test_ecw_48(): ecw_upward = gdal.GetConfigOption('ECW_ALWAYS_UPWARD', 'TRUE') assert ecw_upward == 'TRUE' or ecw_upward == 'ON', \ 'ECW_ALWAYS_UPWARD default value must be TRUE.' ds = gdal.Open('data/ecw/spif83_downward.ecw') gt = ds.GetGeoTransform() # expect Y resolution negative expected_gt = (6138559.5576418638, 195.5116973254697, 0.0, 2274798.7836679211, 0.0, -198.32414964918371) assert gt == expected_gt, 'did not get expected geotransform.' ############################################################################### # Test "Upward" orientation can be overridden with ECW_ALWAYS_UPWARD=FALSE def test_ecw_49(): ecw_upward_old = gdal.GetConfigOption('ECW_ALWAYS_UPWARD', 'TRUE') gdal.SetConfigOption('ECW_ALWAYS_UPWARD', 'FALSE') ds = gdal.Open('data/ecw/spif83_downward.ecw') gt = ds.GetGeoTransform() gdal.SetConfigOption('ECW_ALWAYS_UPWARD', ecw_upward_old) # expect Y resolution positive expected_gt = (6138559.5576418638, 195.5116973254697, 0.0, 2274798.7836679211, 0.0, 198.32414964918371) assert gt == expected_gt, 'did not get expected geotransform.' ############################################################################### def test_ecw_online_1(): if gdaltest.jp2ecw_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/7sisters200.j2k', '7sisters200.j2k'): pytest.skip() # checksum = 32316 on my PC tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/7sisters200.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/7sisters200.j2k') ds.GetRasterBand(1).Checksum() ds = None ############################################################################### def test_ecw_online_2(): if gdaltest.jp2ecw_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/jpeg2000/gcp.jp2', 'gcp.jp2'): pytest.skip() # checksum = 1292 on my PC tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/gcp.jp2', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/gcp.jp2') ds.GetRasterBand(1).Checksum() assert len(ds.GetGCPs()) == 15, 'bad number of GCP' expected_wkt = """GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]""" assert ds.GetGCPProjection() == expected_wkt, 'bad GCP projection' ds = None ############################################################################### def ecw_online_3(): if gdaltest.jp2ecw_drv is None: pytest.skip() if gdaltest.ecw_drv.major_version == 4: pytest.skip('4.x SDK gets unreliable results for jp2') if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.j2k', 'Bretagne1.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne1.bmp', 'Bretagne1.bmp'): pytest.skip() # checksum = 16481 on my PC tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/Bretagne1.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/Bretagne1.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne1.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref) print(ds.GetRasterBand(1).Checksum()) print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Difference between the image before and after compression assert maxdiff <= 16, 'Image too different from reference' ############################################################################### def test_ecw_online_4(): if gdaltest.jp2ecw_drv is None: pytest.skip() if gdaltest.ecw_drv.major_version == 5 and gdaltest.ecw_drv.minor_version == 2: pytest.skip('This test hangs on Linux in a mutex in the SDK 5.2.1') if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.j2k', 'Bretagne2.j2k'): pytest.skip() if not gdaltest.download_file('http://www.openjpeg.org/samples/Bretagne2.bmp', 'Bretagne2.bmp'): pytest.skip() # Checksum = 53054 on my PC tst = gdaltest.GDALTest('JP2ECW', 'tmp/cache/Bretagne2.j2k', 1, None, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/Bretagne2.j2k') ds_ref = gdal.Open('tmp/cache/Bretagne2.bmp') maxdiff = gdaltest.compare_ds(ds, ds_ref, width=256, height=256) # print(ds.GetRasterBand(1).Checksum()) # print(ds_ref.GetRasterBand(1).Checksum()) ds = None ds_ref = None # Difference between the image before and after compression assert maxdiff <= 1, 'Image too different from reference' ############################################################################### def test_ecw_online_5(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/ecw/red_flower.ecw', 'red_flower.ecw'): pytest.skip() ds = gdal.Open('tmp/cache/red_flower.ecw') if gdaltest.ecw_drv.major_version == 3: (exp_mean, exp_stddev) = (112.801, 52.0431) # on Tamas slavebots, (mean,stddev) = (113.301,52.0434) mean_tolerance = 1 else: mean_tolerance = 0.5 if gdaltest.ecw_drv.major_version == 5: (exp_mean, exp_stddev) = (113.345, 52.1259) else: (exp_mean, exp_stddev) = (114.337, 52.1751) (mean, stddev) = ds.GetRasterBand(2).ComputeBandStats() assert mean == pytest.approx(exp_mean, abs=mean_tolerance) and stddev == pytest.approx(exp_stddev, abs=0.5), \ ('mean/stddev of (%g,%g) diffs from expected(%g,%g)' % (mean, stddev, exp_mean, exp_stddev)) ############################################################################### # This tests the HTTP driver in fact. To ensure if keeps the original filename, # and in particular the .ecw extension, to make the ECW driver happy def test_ecw_online_6(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() dods_drv = gdal.GetDriverByName('DODS') if dods_drv is not None: dods_drv.Deregister() url = 'http://download.osgeo.org/gdal/data/ecw/spif83.ecw' ds = gdal.Open(url) if dods_drv is not None: dods_drv.Register() if ds is None: # The ECW driver (3.3) doesn't manage to open in /vsimem, thus fallbacks # to writing to /tmp, which doesn't work on Windows if sys.platform == 'win32': pytest.skip() conn = gdaltest.gdalurlopen(url) if conn is None: pytest.skip('cannot open URL') conn.close() pytest.fail() ds = None ############################################################################### # ECWv2 file with alpha channel (#6028) def test_ecw_online_7(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/ecw/sandiego2m_null.ecw', 'sandiego2m_null.ecw'): pytest.skip() ds = gdal.Open('tmp/cache/sandiego2m_null.ecw') if gdaltest.ecw_drv.major_version == 3: expected_band_count = 3 else: expected_band_count = 4 assert ds.RasterCount == expected_band_count, \ ('Expected %d bands, got %d' % (expected_band_count, ds.RasterCount)) gdalautotest-3.2.2/gdrivers/nwt_grd.py0000775000175000017500000000515314020414370016541 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: nwt_grd.py 5c13f6863a30844531df2b523e504908363905d4 2020-05-10 15:04:05 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Northwood GRD driver # Author: Chaitanya kumar CH, # ############################################################################### # Copyright (c) 2009, Chaitanya kumar CH, # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import shutil from osgeo import gdal import gdaltest ############################################################################### # Test a GRD dataset with three bands + Z def test_nwt_grd_1(): tst1 = gdaltest.GDALTest('NWT_GRD', 'nwt_grd/nwt_grd.grd', 1, 28093) tst1.testOpen() tst2 = gdaltest.GDALTest('NWT_GRD', 'nwt_grd/nwt_grd.grd', 2, 33690) tst2.testOpen() tst3 = gdaltest.GDALTest('NWT_GRD', 'nwt_grd/nwt_grd.grd', 3, 20365) tst3.testOpen() tst4 = gdaltest.GDALTest('NWT_GRD', 'nwt_grd/nwt_grd.grd', 4, 25856) tst4.testOpen() def test_nwt_grd_2(): """ Test writing a GRD via CreateCopy """ shutil.copy('data/nwt_grd/nwt_grd.grd', 'tmp/nwt_grd.grd') tst1 = gdaltest.GDALTest('NWT_GRD', 'tmp/nwt_grd.grd', 1, 25856, filename_absolute=1, open_options=['BAND_COUNT=1']) ret = tst1.testCreateCopy(new_filename='tmp/out.grd', check_minmax=0, dest_open_options=['BAND_COUNT=1']) gdal.Unlink('tmp/nwt_grd.grd') gdal.Unlink('tmp/nwt_grd.grd.aux.xml') return ret gdalautotest-3.2.2/gdrivers/pcraster.py0000775000175000017500000000561314020414370016721 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: pcraster.py fa839b55f793867fe0bfe7239f18216793be4f7f 2020-09-18 16:59:11 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test PCRaster driver support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest pytestmark = pytest.mark.require_driver('PCRaster') ############################################################################### # Perform simple read test. def test_pcraster_1(): tst = gdaltest.GDALTest('PCRaster', 'pcraster/ldd.map', 1, 4528) return tst.testOpen() ############################################################################### # Verify some auxiliary data. def test_pcraster_2(): ds = gdal.Open('data/pcraster/ldd.map') gt = ds.GetGeoTransform() assert gt[0] == 182140.0 and gt[1] == 10 and gt[2] == 0 and gt[3] == 327880.0 and gt[4] == 0 and gt[5] == -10, \ 'PCRaster geotransform wrong.' band1 = ds.GetRasterBand(1) assert band1.GetNoDataValue() == 255, 'PCRaster NODATA value wrong or missing.' ############################################################################### def test_pcraster_createcopy(): tst = gdaltest.GDALTest('PCRaster', 'pcraster/ldd.map', 1, 4528) return tst.testCreateCopy(new_filename = 'tmp/ldd.map') ############################################################################### def test_pcraster_create(): tst = gdaltest.GDALTest('PCRaster', 'float32.tif', 1, 4672, options=['PCRASTER_VALUESCALE=VS_SCALAR']) return tst.testCreate(new_filename = 'tmp/float32.map') gdalautotest-3.2.2/gdrivers/genbin.py0000775000175000017500000000413614020414370016337 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: genbin.py 596abc331baf4bbd1c49f5c1af9645fb01bfcd08 2020-05-10 14:27:09 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Generic Binary format driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import osr import gdaltest ############################################################################### # Perform simple read test. def test_genbin_1(): tst = gdaltest.GDALTest('GenBin', 'genbin/tm4628_96.bil', 1, 5738, 0, 0, 500, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(32049) gt = (1181700.9894981384, 82.021003723042099, 0.0, 596254.01050186157, 0.0, -82.021003723045894) return tst.testOpen(check_prj=sr.ExportToWkt(), check_gt=gt) gdalautotest-3.2.2/gdrivers/ehdr.py0000775000175000017500000003100714020414370016014 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ehdr.py 9c1d2cb8f61668b50989b1fcfd4193bbb648f40e 2020-06-27 21:10:06 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test EHdr format driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # Copyright (c) 2008-2011, Even Rouault # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import struct from osgeo import gdal import gdaltest import pytest ############################################################################### # 16bit image. def test_ehdr_1(): tst = gdaltest.GDALTest('EHDR', 'png/rgba16.png', 2, 2042) return tst.testCreate() ############################################################################### # 8bit with geotransform and projection check. def test_ehdr_2(): tst = gdaltest.GDALTest('EHDR', 'byte.tif', 1, 4672) return tst.testCreateCopy(check_gt=1, check_srs=1) ############################################################################### # 32bit floating point (read, and createcopy). def test_ehdr_3(): tst = gdaltest.GDALTest('EHDR', 'ehdr/float32.bil', 1, 27) return tst.testCreateCopy() ############################################################################### # create dataset with a nodata value and a color table. def test_ehdr_4(): drv = gdal.GetDriverByName('EHdr') ds = drv.Create('tmp/test_4.bil', 200, 100, 1, gdal.GDT_Byte) raw_data = b''.join(struct.pack('h', v) for v in range(200)) for line in range(100): ds.WriteRaster(0, line, 200, 1, raw_data, buf_type=gdal.GDT_Int16) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 255, 255, 255)) ct.SetColorEntry(1, (255, 255, 0, 255)) ct.SetColorEntry(2, (255, 0, 255, 255)) ct.SetColorEntry(3, (0, 255, 255, 255)) ds.GetRasterBand(1).SetRasterColorTable(ct) ds.GetRasterBand(1).SetRasterColorTable(None) ds.GetRasterBand(1).SetRasterColorTable(ct) ds.GetRasterBand(1).SetNoDataValue(17) ds = None ############################################################################### # verify last dataset's colortable and nodata value. def test_ehdr_5(): ds = gdal.Open('tmp/test_4.bil') band = ds.GetRasterBand(1) assert band.GetNoDataValue() == 17, 'failed to preserve nodata value.' ct = band.GetRasterColorTable() assert ct is not None and ct.GetCount() == 4 and ct.GetColorEntry(2) == (255, 0, 255, 255), \ 'color table not persisted properly.' assert not band.GetDefaultRAT(), 'did not expect RAT' band = None ct = None ds = None gdal.GetDriverByName('EHdr').Delete('tmp/test_4.bil') ############################################################################### # Test creating an in memory copy. def test_ehdr_6(): tst = gdaltest.GDALTest('EHDR', 'ehdr/float32.bil', 1, 27) return tst.testCreateCopy(vsimem=1) ############################################################################### # 32bit integer (read, and createcopy). def test_ehdr_7(): tst = gdaltest.GDALTest('EHDR', 'int32.tif', 1, 4672) return tst.testCreateCopy() ############################################################################### # Test signed 8bit integer support. (#2717) def test_ehdr_8(): drv = gdal.GetDriverByName('EHDR') src_ds = gdal.Open('data/ehdr/8s.vrt') ds = drv.CreateCopy('tmp/ehdr_8.bil', src_ds) src_ds = None md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') assert 'PIXELTYPE' in md and md['PIXELTYPE'] == 'SIGNEDBYTE', \ 'Failed to detect SIGNEDBYTE' cs = ds.GetRasterBand(1).Checksum() expected = 4672 assert cs == expected, 'Did not get expected image checksum.' ds = None drv.Delete('tmp/ehdr_8.bil') ############################################################################### # Test opening worldclim .hdr files that have a few extensions fields in the # .hdr file to specify minimum, maximum and projection. Also test that we # correctly guess the signedness of the datatype from the sign of the nodata # value. def test_ehdr_9(): ds = gdal.Open('data/ehdr/wc_10m_CCCMA_A2a_2020_tmin_9.bil') assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16, 'wrong datatype' assert ds.GetRasterBand(1).GetMinimum() == -191, 'wrong minimum value' wkt = ds.GetProjectionRef() assert wkt.startswith('GEOGCS["WGS 84'), 'wrong projection' ds = None ############################################################################### # Test detecting floating point file based on image file size (#3933) def test_ehdr_10(): tst = gdaltest.GDALTest('EHDR', 'ehdr/ehdr10.bil', 1, 8202) return tst.testOpen() ############################################################################### # Test detecting floating point file based on .flt extension (#3933) def test_ehdr_11(): tst = gdaltest.GDALTest('EHDR', 'ehdr/ehdr11.flt', 1, 8202) return tst.testOpen() ############################################################################### # Test CreateCopy with 1bit data def test_ehdr_12(): src_ds = gdal.Open('../gcore/data/1bit.bmp') ds = gdal.GetDriverByName('EHDR').CreateCopy('/vsimem/1bit.bil', src_ds, options=['NBITS=1']) ds = None ds = gdal.Open('/vsimem/1bit.bil') assert ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum(), \ 'did not get expected checksum' ds = None src_ds = None gdal.GetDriverByName('EHDR').Delete('/vsimem/1bit.bil') ############################################################################### # Test statistics def test_ehdr_13(): gdal.Unlink('data/byte.tif.aux.xml') src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('EHDR').CreateCopy('/vsimem/byte.bil', src_ds) ds = None src_ds = None ds = gdal.Open('/vsimem/byte.bil') assert ds.GetRasterBand(1).GetMinimum() is None, 'did not expected minimum' assert ds.GetRasterBand(1).GetMaximum() is None, 'did not expected maximum' stats = ds.GetRasterBand(1).GetStatistics(False, True) expected_stats = [74.0, 255.0, 126.765, 22.928470838675704] for i in range(4): assert stats[i] == pytest.approx(expected_stats[i], abs=0.0001), 'did not get expected statistics' ds = None f = gdal.VSIFOpenL('/vsimem/byte.stx', 'rb') assert f is not None, 'expected .stx file' gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/byte.bil') assert ds.GetRasterBand(1).GetMinimum() == pytest.approx(74, abs=0.0001), \ 'did not get expected minimum' assert ds.GetRasterBand(1).GetMaximum() == pytest.approx(255, abs=0.0001), \ 'did not get expected maximum' stats = ds.GetRasterBand(1).GetStatistics(False, True) expected_stats = [74.0, 255.0, 126.765, 22.928470838675704] for i in range(4): assert stats[i] == pytest.approx(expected_stats[i], abs=0.0001), 'did not get expected statistics' ds = None gdal.GetDriverByName('EHDR').Delete('/vsimem/byte.bil') ############################################################################### # Test optimized RasterIO() (#5438) def test_ehdr_14(): src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('EHDR').CreateCopy('/vsimem/byte.bil', src_ds) src_ds = None for space in [1, 2]: out_ds = gdal.GetDriverByName('EHDR').Create('/vsimem/byte_reduced.bil', 10, 10) gdal.SetConfigOption('GDAL_ONE_BIG_READ', 'YES') data_ori = ds.GetRasterBand(1).ReadRaster( 0, 0, 20, 20, 20, 20, buf_pixel_space=space) data = ds.GetRasterBand(1).ReadRaster( 0, 0, 20, 20, 10, 10, buf_pixel_space=space) out_ds.GetRasterBand(1).WriteRaster( 0, 0, 10, 10, data, 10, 10, buf_pixel_space=space) out_ds.FlushCache() data2 = out_ds.ReadRaster(0, 0, 10, 10, 10, 10, buf_pixel_space=space) cs1 = out_ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_ONE_BIG_READ', None) out_ds.FlushCache() cs2 = out_ds.GetRasterBand(1).Checksum() assert space != 1 or data == data2 assert not (cs1 != 1087 and cs1 != 1192) or (cs2 != 1087 and cs2 != 1192), space gdal.SetConfigOption('GDAL_ONE_BIG_READ', 'YES') out_ds.GetRasterBand(1).WriteRaster( 0, 0, 10, 10, data_ori, 20, 20, buf_pixel_space=space) gdal.SetConfigOption('GDAL_ONE_BIG_READ', None) out_ds.FlushCache() cs3 = out_ds.GetRasterBand(1).Checksum() assert cs3 == 1087 or cs3 == 1192, space ds = None gdal.GetDriverByName('EHDR').Delete('/vsimem/byte.bil') gdal.GetDriverByName('EHDR').Delete('/vsimem/byte_reduced.bil') ############################################################################### # Test support for RAT (#3253) def test_ehdr_rat(): tmpfile = '/vsimem/rat.bil' gdal.Translate(tmpfile, 'data/ehdr/int16_rat.bil', format='EHdr') ds = gdal.Open(tmpfile) rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat is not None assert rat.GetColumnCount() == 4 assert rat.GetRowCount() == 25 for (idx, val) in [(0, -500), (1, 127), (2, 40), (3, 65)]: assert rat.GetValueAsInt(0, idx) == val for (idx, val) in [(0, 2000), (1, 145), (2, 97), (3, 47)]: assert rat.GetValueAsInt(24, idx) == val assert ds.GetRasterBand(1).GetColorTable() is not None ds = None ds = gdal.Open(tmpfile, gdal.GA_Update) ds.GetRasterBand(1).SetDefaultRAT(None) ds.GetRasterBand(1).SetColorTable(None) ds = None ds = gdal.Open(tmpfile, gdal.GA_Update) assert not (ds.GetRasterBand(1).GetDefaultRAT() or ds.GetRasterBand(1).GetColorTable()) with gdaltest.error_handler(): ret = ds.GetRasterBand(1).SetDefaultRAT(gdal.RasterAttributeTable()) assert ret != 0 ds = None gdal.GetDriverByName('EHDR').Delete(tmpfile) ############################################################################### # Test STATISTICS_APPROXIMATE def test_ehdr_approx_stats_flag(): src_ds = gdal.GetDriverByName('MEM').Create('', 2000, 2000) src_ds.GetRasterBand(1).WriteRaster(1000, 1000, 1, 1, struct.pack('B' * 1, 20)) tmpfile = '/vsimem/ehdr_approx_stats_flag.bil' gdal.Translate(tmpfile, src_ds, format='EHdr') ds = gdal.Open(tmpfile, gdal.GA_Update) approx_ok = 1 force = 1 stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) assert stats == [0.0, 0.0, 0.0, 0.0], 'did not get expected stats' md = ds.GetRasterBand(1).GetMetadata() assert 'STATISTICS_APPROXIMATE' in md, 'did not get expected metadata' approx_ok = 0 force = 0 stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) assert stats == [0.0, 0.0, 0.0, -1.0], 'did not get expected stats' ds = gdal.Open(tmpfile, gdal.GA_Update) approx_ok = 0 force = 0 stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) assert stats == [0.0, 0.0, 0.0, -1.0], 'did not get expected stats' approx_ok = 0 force = 1 stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) assert stats[1] == 20.0, 'did not get expected stats' md = ds.GetRasterBand(1).GetMetadata() assert 'STATISTICS_APPROXIMATE' not in md, 'did not get expected metadata' ds = None gdal.GetDriverByName('EHDR').Delete(tmpfile) gdalautotest-3.2.2/gdrivers/dods.py0000775000175000017500000001116114020414370016022 0ustar eveneven#!/usr/bin/env pytest ############################################################################### # $Id: dods.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test DODS raster access. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### from osgeo import gdal import gdaltest import pytest ############################################################################### # Open DODS datasource. @pytest.mark.skip() def test_dods_1(): gdaltest.dods_ds = None gdaltest.dods_dr = None gdaltest.dods_dr = gdal.GetDriverByName('DODS') if gdaltest.dods_dr is None: pytest.skip() gdaltest.dods_grid_ds = gdal.Open('http://disc1.sci.gsfc.nasa.gov/opendap/tovs/TOVSAMNF/1985/032/TOVS_MONTHLY_PM_8502_NF.HDF.Z?Data-Set-11[y][x]') if gdaltest.dods_grid_ds is None: gdaltest.dods_dr = None pytest.fail() ############################################################################### # Simple read test on a single variable. @pytest.mark.skip() def test_dods_2(): if gdaltest.dods_dr is None: pytest.skip() tst = gdaltest.GDALTest('dods', 'http://disc1.sci.gsfc.nasa.gov/opendap/tovs/TOVSAMNF/1985/032/TOVS_MONTHLY_PM_8502_NF.HDF.Z?Data-Set-11', 1, 3391, filename_absolute=1) return tst.testOpen() ############################################################################### # Access all grids at once. @pytest.mark.skip() def test_dods_3(): if gdaltest.dods_dr is None: pytest.skip() tst = gdaltest.GDALTest('dods', 'http://disc1.sci.gsfc.nasa.gov/opendap/tovs/TOVSAMNF/1985/032/TOVS_MONTHLY_PM_8502_NF.HDF.Z', 12, 43208, filename_absolute=1) return tst.testOpen() ############################################################################### # Test explicit transpose. @pytest.mark.skip() def test_dods_4(): if gdaltest.dods_dr is None: pytest.skip() tst = gdaltest.GDALTest('dods', 'http://disc1.sci.gsfc.nasa.gov/opendap/tovs/TOVSAMNF/1985/032/TOVS_MONTHLY_PM_8502_NF.HDF.Z?Data-Set-11[y][x]', 1, 3391, filename_absolute=1) return tst.testOpen() ############################################################################### # Test explicit flipping. @pytest.mark.skip() def test_dods_5(): if gdaltest.dods_dr is None: pytest.skip() tst = gdaltest.GDALTest('dods', 'http://disc1.sci.gsfc.nasa.gov/opendap/tovs/TOVSAMNF/1985/032/TOVS_MONTHLY_PM_8502_NF.HDF.Z?Data-Set-11[y][-x]', 1, 2436, filename_absolute=1) return tst.testOpen() ############################################################################### # Check nodata value. @pytest.mark.skip() def test_dods_6(): if gdaltest.dods_dr is None: pytest.skip() # This server seems to no longer be online, skipping test. pytest.skip() # pylint: disable=unreachable gdaltest.dods_grid_ds = gdal.Open('http://g0dup05u.ecs.nasa.gov/opendap/AIRS/AIRX3STD.003/2004.12.28/AIRS.2004.12.28.L3.RetStd001.v4.0.9.0.G05253115303.hdf?TotH2OVap_A[y][x]') nd = gdaltest.dods_grid_ds.GetRasterBand(1).GetNoDataValue() assert nd == -9999.0, 'nodata value wrong or missing.' ############################################################################### # Cleanup @pytest.mark.skip() def test_dods_cleanup(): if gdaltest.dods_dr is None: pytest.skip() gdaltest.dods_dr = None gdaltest.dods_grid_ds = None gdalautotest-3.2.2/gdrivers/vrtderived.py0000775000175000017500000007203314020414370017254 0ustar eveneven#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vrtderived.py 3ea1cb89d5dccaea43fecf7aa9aee474abd27f8a 2020-05-10 16:21:22 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test AddBand() with VRTDerivedRasterBand. # Author: Antonio Valentino # ############################################################################### # Copyright (c) 2011, Antonio Valentino # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. ############################################################################### import os import threading from osgeo import gdal import gdaltest import pytest def _xmlsearch(root, nodetype, name): for node in root[2:]: if node[0] == nodetype and node[1] == name: return node ############################################################################### # Verify raster band subClass def test_vrtderived_1(): filename = 'tmp/derived.vrt' vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) options = [ 'subClass=VRTDerivedRasterBand', ] vrt_ds.AddBand(gdal.GDT_Byte, options) simpleSourceXML = ''' data/byte.tif 1 ''' md = {} md['source_0'] = simpleSourceXML vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') md_read = vrt_ds.GetRasterBand(1).GetMetadata('vrt_sources') vrt_ds = None expected_md_read = ( '\n' ' data/byte.tif\n' ' 1\n' ' \n' '\n') assert md_read['source_0'] == expected_md_read xmlstring = open(filename).read() gdal.Unlink(filename) node = gdal.ParseXMLString(xmlstring) node = _xmlsearch(node, gdal.CXT_Element, 'VRTRasterBand') node = _xmlsearch(node, gdal.CXT_Attribute, 'subClass') node = _xmlsearch(node, gdal.CXT_Text, 'VRTDerivedRasterBand') assert node is not None, 'invalid subclass' ############################################################################### # Verify derived raster band pixel function type def test_vrtderived_2(): filename = 'tmp/derived.vrt' vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) options = [ 'subClass=VRTDerivedRasterBand', 'PixelFunctionType=dummy', 'PixelFunctionLanguage=Python', ] vrt_ds.AddBand(gdal.GDT_Byte, options) simpleSourceXML = ''' data/byte.tif 1 ''' md = {} md['source_0'] = simpleSourceXML vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') with gdaltest.error_handler(): cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 0 with gdaltest.error_handler(): ret = vrt_ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, ' ') assert ret != 0 vrt_ds = None xmlstring = open(filename).read() gdal.Unlink(filename) node = gdal.ParseXMLString(xmlstring) node = _xmlsearch(node, gdal.CXT_Element, 'VRTRasterBand') pixelfunctiontype = _xmlsearch(node, gdal.CXT_Element, 'PixelFunctionType') pixelfunctiontype = _xmlsearch(pixelfunctiontype, gdal.CXT_Text, 'dummy') assert pixelfunctiontype is not None, 'incorrect PixelFunctionType value' pixelfunctionlanguage = _xmlsearch(node, gdal.CXT_Element, 'PixelFunctionLanguage') pixelfunctionlanguage = _xmlsearch(pixelfunctionlanguage, gdal.CXT_Text, 'Python') assert pixelfunctionlanguage is not None, 'incorrect PixelFunctionLanguage value' ############################################################################### # Verify derived raster band transfer type def test_vrtderived_3(): filename = 'tmp/derived.vrt' vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) options = [ 'subClass=VRTDerivedRasterBand', 'PixelFunctionType=dummy', 'SourceTransferType=Byte', ] vrt_ds.AddBand(gdal.GDT_Byte, options) simpleSourceXML = ''' data/byte.tif 1 ''' md = {} md['source_0'] = simpleSourceXML vrt_ds.GetRasterBand(1).SetMetadata(md, 'vrt_sources') vrt_ds = None xmlstring = open(filename).read() gdal.Unlink(filename) node = gdal.ParseXMLString(xmlstring) node = _xmlsearch(node, gdal.CXT_Element, 'VRTRasterBand') node = _xmlsearch(node, gdal.CXT_Element, 'SourceTransferType') node = _xmlsearch(node, gdal.CXT_Text, 'Byte') assert node is not None, 'incorrect SourceTransferType value' ############################################################################### # Check handling of invalid derived raster band transfer type def test_vrtderived_4(): filename = 'tmp/derived.vrt' vrt_ds = gdal.GetDriverByName('VRT').Create(filename, 50, 50, 0) options = [ 'subClass=VRTDerivedRasterBand', 'PixelFunctionType=dummy', 'SourceTransferType=Invalid', ] gdal.PushErrorHandler('CPLQuietErrorHandler') ret = vrt_ds.AddBand(gdal.GDT_Byte, options) gdal.PopErrorHandler() assert ret != 0, 'invalid SourceTransferType value not detected' ############################################################################### # Check Python derived function with BufferRadius=1 def test_vrtderived_5(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') ds = gdal.Open('data/vrt/n43_hillshade.vrt') cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) assert cs == 50577, 'invalid checksum' ############################################################################### # Check Python derived function with BufferRadius=0 and no source def test_vrtderived_6(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') ds = gdal.Open('data/vrt/python_ones.vrt') cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) assert cs == 10000, 'invalid checksum' ############################################################################### # Check Python derived function with no started Python interpreter def test_vrtderived_7(): import test_cli_utilities if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES') if gdal.GetConfigOption('CPL_DEBUG') is not None: print(err) # Either we cannot find a Python library, either it works if 'Checksum=0' in ret: print('Did not manage to find a Python library') elif 'Checksum=50577' not in ret: print(err) pytest.fail(ret) ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config VRT_ENABLE_PYTHON_PATH NO') if gdal.GetConfigOption('CPL_DEBUG') is not None: print(err) # Either we cannot find a Python library, either it works if 'Checksum=0' in ret: print('Did not manage to find a Python library') elif 'Checksum=50577' not in ret: print(err) pytest.fail(ret) ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config VRT_ENABLE_PYTHON_SYMLINK NO') if gdal.GetConfigOption('CPL_DEBUG') is not None: print(err) # Either we cannot find a Python library, either it works if 'Checksum=0' in ret: print('Did not manage to find a Python library') elif 'Checksum=50577' not in ret: print(err) pytest.fail(ret) # Invalid shared object name ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config PYTHONSO foo') if gdal.GetConfigOption('CPL_DEBUG') is not None: print(err) assert 'Checksum=0' in ret, err # Valid shared object name, but without Python symbols libgdal_so = gdaltest.find_lib('gdal') if libgdal_so is not None: ret, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -checksum data/vrt/n43_hillshade.vrt --config GDAL_VRT_ENABLE_PYTHON YES --config PYTHONSO "%s"' % libgdal_so) if gdal.GetConfigOption('CPL_DEBUG') is not None: print(err) assert 'Checksum=0' in ret, err ############################################################################### # Check that GDAL_VRT_ENABLE_PYTHON=NO or undefined is honored def test_vrtderived_8(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'NO') ds = gdal.Open('data/vrt/n43_hillshade.vrt') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) assert cs == 0, 'invalid checksum' ds = gdal.Open('data/vrt/n43_hillshade.vrt') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() assert cs == 0, 'invalid checksum' ############################################################################### # Check various failure modes with Python functions def test_vrtderived_9(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() # Missing PixelFunctionType with gdaltest.error_handler(): ds = gdal.Open(""" Python """) assert ds is None # Unsupported PixelFunctionLanguage with gdaltest.error_handler(): ds = gdal.Open(""" identity foo """) assert ds is None # PixelFunctionCode can only be used with Python with gdaltest.error_handler(): ds = gdal.Open(""" identity """) assert ds is None # PixelFunctionArguments can only be used with Python with gdaltest.error_handler(): ds = gdal.Open(""" identity """) assert ds is None # BufferRadius can only be used with Python with gdaltest.error_handler(): ds = gdal.Open(""" identity 1 """) assert ds is None # Invalid BufferRadius with gdaltest.error_handler(): ds = gdal.Open(""" identity Python -1 """) assert ds is None # Error at Python code compilation (indentation error) ds = gdal.Open(""" identity Python """) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # Error at run time (in global code) ds = gdal.Open(""" identity Python """) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # Error at run time (in pixel function) ds = gdal.Open(""" identity Python """) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # User exception ds = gdal.Open(""" identity Python """) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # unknown_function ds = gdal.Open(""" unknown_function Python """) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # uncallable object ds = gdal.Open(""" uncallable_object Python """) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # unknown_module ds = gdal.Open(""" unknown_module.unknown_function Python """) with gdaltest.error_handler(): gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') def vrtderived_code_that_only_makes_sense_with_GDAL_VRT_ENABLE_PYTHON_equal_IF_SAFE_but_that_is_now_disabled(): # untrusted import ds = gdal.Open(""" my_func Python """) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # untrusted function ds = gdal.Open(""" my_func Python """) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # GDAL_VRT_ENABLE_PYTHON not set to YES ds = gdal.Open(""" vrtderived.one_pix_func Python """) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') ############################################################################### # Check Python function in another module def one_pix_func(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize, r, gt, **kwargs): # pylint: disable=unused-argument out_ar.fill(1) def test_vrtderived_10(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() content = """ Gray vrtderived.one_pix_func Python """ ds = gdal.Open(content) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 100: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # GDAL_VRT_TRUSTED_MODULES not defined ds = gdal.Open(content) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # GDAL_VRT_PYTHON_TRUSTED_MODULES *NOT* matching our module for val in ['vrtderive', 'vrtderivedX', 'vrtderivedX*', 'vrtderive.*' 'vrtderivedX.*']: ds = gdal.Open(content) gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', val) with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', None) if cs != 0: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # GDAL_VRT_PYTHON_TRUSTED_MODULES matching our module for val in ['foo,vrtderived,bar', '*', 'foo,vrtderived*,bar', 'foo,vrtderived.*,bar', 'foo,vrtderi*,bar']: ds = gdal.Open(content) gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', val) cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_PYTHON_TRUSTED_MODULES', None) if cs != 100: print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') ############################################################################### # Test serializing with python code def test_vrtderived_11(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() gdal.FileFromMemBuffer('/vsimem/n43_hillshade.vrt', open('data/vrt/n43_hillshade.vrt', 'rb').read().decode('UTF-8').replace('../', '').encode('UTF-8')) gdal.FileFromMemBuffer('/vsimem/n43.dt0', open('data/n43.dt0', 'rb').read()) ds = gdal.Open('/vsimem/n43_hillshade.vrt', gdal.GA_Update) ds.SetMetadataItem('foo', 'bar') ds = None ds = gdal.Open('/vsimem/n43_hillshade.vrt') gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', 'YES') cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) ds = None gdal.Unlink('/vsimem/n43_hillshade.vrt') gdal.Unlink('/vsimem/n43.dt0') assert cs == 50577, 'invalid checksum' ############################################################################### # Test all data types with python code def test_vrtderived_12(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() for dt in ["Byte", "UInt16", "Int16", "UInt32", "Int32", "Float32", "Float64", "CInt16", "CInt32", "CFloat32", "CFloat64"]: ds = gdal.Open(""" Gray vrtderived.one_pix_func Python """ % dt) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) # CInt16/CInt32 do not map to native numpy types if dt == 'CInt16' or dt == 'CInt32': expected_cs = 0 # error else: expected_cs = 100 if cs != expected_cs: print(dt) print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') # Same for SourceTransferType for dt in ["CInt16", "CInt32"]: ds = gdal.Open(""" Byte Gray vrtderived.one_pix_func Python """ % dt) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) if cs != 0: print(dt) print(gdal.GetLastErrorMsg()) pytest.fail('invalid checksum') ############################################################################### # Test translating a Python derived VRT def test_vrtderived_13(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") # Will test the VRTDerivedRasterBand::IGetDataCoverageStatus() interface ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrtderived_13.tif', gdal.Open('data/vrt/python_ones.vrt')) gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('/vsimem/vrtderived_13.tif') assert cs == 10000, 'invalid checksum' ############################################################################### # Test statistics functions def test_vrtderived_14(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrtderived_14.vrt', gdal.Open('data/vrt/python_ones.vrt')) (my_min, my_max) = ds.GetRasterBand(1).ComputeRasterMinMax() (my_min2, my_max2, mean, stddev) = ds.GetRasterBand(1).ComputeStatistics(False) hist = ds.GetRasterBand(1).GetHistogram() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) assert (my_min, my_max) == (1.0, 1.0), 'invalid ComputeRasterMinMax' assert (my_min2, my_max2, mean, stddev) == (1.0, 1.0, 1.0, 0.0), \ 'invalid ComputeStatistics' assert hist[1] == 10000, 'invalid GetHistogram' ds = None gdal.GetDriverByName('VRT').Delete('/vsimem/vrtderived_14.vrt') ############################################################################### # Test threading def vrtderived_15_worker(args_dict): content = """ Gray vrtderived.one_pix_func Python """ ds = gdal.Open(content) for _ in range(5): cs = ds.GetRasterBand(1).Checksum() if cs != 2304: print(cs) args_dict['ret'] = False ds.FlushCache() def test_vrtderived_15(): try: import numpy numpy.ones except (ImportError, AttributeError): pytest.skip() gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', "YES") threads = [] args_array = [] for i in range(4): args_dict = {'ret': True} t = threading.Thread(target=vrtderived_15_worker, args=(args_dict,)) args_array.append(args_dict) threads.append(t) t.start() ret = 'success' for i in range(4): threads[i].join() if not args_array[i]: ret = 'fail' gdal.SetConfigOption('GDAL_VRT_ENABLE_PYTHON', None) return ret ############################################################################### # Cleanup. def test_vrtderived_cleanup(): try: os.remove('tmp/derived.vrt') except OSError: pass gdalautotest-3.2.2/gdrivers/data/0000775000175000017500000000000014020414374015431 5ustar evenevengdalautotest-3.2.2/gdrivers/data/ctg/0000775000175000017500000000000014020414072016201 5ustar evenevengdalautotest-3.2.2/gdrivers/data/ctg/fake_grid_cell0000664000175000017500000000074014020414072021037 0ustar eveneven 558 868618 789 0 200 4 17 14 1 7874016 1984 1 1 789 558 1 556 8 0 395 3 782 0 789 556 395 369 450000 1000000 460000 1000000 460000 990000 460000 980000 450000 980000 450000 990000 421100 5094300 91170 FAKE CITY 14 422600 5094200 21 38029 10130102 38029532 0 0gdalautotest-3.2.2/gdrivers/data/small_world_pct.tif0000664000175000017500000012126514020414072021324 0ustar evenevenII*  =@6S 6 N ~   %j%9KP[+jwÁ$$||||ظxx88\\44\\$$((XX88((00HH||hhPP00XX@@||@@ @@@@llPP00XXHH88ll0088||0000@@HH젠ttllHHPP||||88@@88 hh@@ PP@@008800llllHH88@@00HHXX@@ PP88||0088 @@((\\44``XX䠠 ((@@HHPP88hh((00PP((88||Ȥ䬬܄HH@@ll0088@@44((hh$$ll44hh$$00||HH$$\\@@ 44TTll((tt 00ppԸddDDPP\\8888LL88@@@@HHPP||``LLHHLLHHpp``00dd88``XXhhHH@@XXXX@@``̨ppHH 00hhPPXXPP tt䠠xxHHXXpp\\44xx@@ HH XXPPdd@@000088XX\\XX<<<<@@HH||llHH00ؤLLظ PPHHll<<00@@88||PPhhhhȰ8888PPĨPPPPhh@@88LLLL00hh00HHddȰШ00ĐHHHH||@@@@\\HH88<:C؅%B88~!o@#258z^RP`He9.JmjDy'xA9Yj0X =4ȓuX|x`A gpK@oRcwܭw퉼BwDzm;v'ǚ1Z7Pf#`Wm`nǶ17lChe<:ȂVVzs~X&d'lkmn&Y,|3ݛr$;yo" Rr*yLSo#t0񎱶.(E0Sk_QFس^S-hOzuE^fФtUS)g*RB2Blw#c_Kg͍2G b?vb|6j&Q/0Gs[XK6Ɩ, I |5C]/̌0^ zs炳<*aWRط3,HK*D?X4UDD+g8a bLPB 2~ %j&woeo_m&4Suӹ#Z;R(n85ƺswz&KeNm2A73[6Q>+$Q1P3:3<&WݟI~^L!QtfA0 |]w av-MU5L,K 7s[ t0X(䣎Q녴- >* Xf'_h^6]T͗9e53㘹k[烟6*V,Bn8" 'blkzkr%@fivg;"{밷C "=yCܔ|=gHmЬPw4)77ihd7PAV)77;NK~9ӓ*8sjWUw (]wxQbu,|_uyzDzc۩>v6nBR,B*%fl#Y:܂*E-bTJ"k}6{+jGrż`":>)%N$]dobE)&[բS$ NqҎ=ٖO@H|,/:{DXQk„.m9r չ\K^.ZvX`/O%~ѵ2c49^}.D$#" GNvH~wAtsOB"G- h[G֣Kv讆]rSubX5eFdUӏTW/yu|PՇM5~[B;ha(.as6pV67g>/ ٛ/VgW2۔sG_Pl}vWōE${_[`\r<^+JEjWtA|a(z\Aև%1{Z͌9%$c>4qg`a&b5d0}b?_,vV%4^u! F=xuYahhz.؍YUw*Mv7SszX劄q #&,l9P]6G"; Nv$N^m6ЁpҚ;1S60d:3}?qwJؒ,}<'"6(FZeYxۍɻ.[-DZvsn*/Js^~so]:^"|//w?֞ޏ"n\2nyt߱~tE«ɮǪ. -thU=n<=]m2dJmѺ_(ƻbip%wq_s3ù[}jQn .Tڞ)4fIRV(*1mDyuݎq`xdZTNN9]WB+lTV`ilj {E^>w//-͕沥{~Pon[KkkZa/=¿|BP*>]3_μA2۩FqzD%7ƞ֕zv%d$*InP.U\,9X by^3#><"7(ը,U'?wшm!Wt'>Vc~qƎo-L:Ca, 77 TzdqAQh.4(e j/͕Y seG{8H;}YSW*x8_/@SYoYc^*R7 ״/l1K#&Z+-;GVWWodW8j×zo.m̌XٽL]%:^G+ k? z]mJ> رR_>_ϭșQr*-(HRUu*}W%T5BzBL-])άQڃW?cQ;~ E]z^dq,R߀VL$v>w ?WLJymO,U*L@myUHoAyB^0J_6xĔ}>є"O l~ д([gɜpWœ h)# 2B7PF>>c9(yClQ@RD)R)[Zt # Sv}ZWyh-Z;KU8h; B@(2UQ5r]E<]?¶v?T ;|'o_ªWT`pGab  ״Dc;Ѽ="TrZI$| "MKmefmFP-,M/VB*رpA犵Rj~4-1Աc!qT1Ńd+OWIK:!%U% Kourec$r!0}ߗHZp*S .6JB?,ac.+lW)x!gq2!!#/W35ؼ`Px%% :yLb8k9Y8eYq^U9Z%{=|"dHe!T4T|Ij"o%5{nCA̧%6ՠ=sUKІĮ'хR5=,v"“'_T֩A<`@"1 !Hb;ؽ6𡞯^#Hփ$P*$G[=`Es k_(€f<@C{VY?)0J9ѹbJM]~É]ek"ټ-X*mhWÆJP 2`TI*̃ WȗQ`{[($߻ Fpcj_y֒ Otp[S8~oճ'4kaa,2,x2hjhx7x⯹?v%=⺯',sI8G8~$vv*g٤&f'o0gتh4:,]%|~ dc!mErt;-I5=޽^'$.͂-L̖P s y ;MWluxU^l6s }phаrDf&#JsaMa,(e [/+5m?wx.ҠGq%yKUG#_wRIP*&&{VKQt_gkkG la9[Hb]U#֎WIMUa*#O ]HXyH` oƷ]$RR{kHb  MonBAoL pzЦo< 3eM&'׳A8S/+"^rv*:z VLtW&_p(/_RI=KY=U 4/A Wi8M6nh;!ELmE;Qr&p<}-Nov#d Hd]m3aͽ? IhxX\wHbњ%NKVS|{CL*yM IVՒpmFyTPA TsЊނyN&In_`EO{Jsc呧cSi(,yehB60PItAɉvǛVS6B傶ө?`BlI7 *@J/IUKV+܍N 2&^LM@޵;YdM܏w y7^KU5Gn4Hy7nAF 4m}^s&x,]_&5YGd;9sasX.tͺEӺv5B|{P8݂ `unʟ@nLI n8srV1>D,2A%%4^HxM0R"1Oh[b}LܺԔHv*6D4 oi:X._LL[n}t[H V@FH(bzGk@ J@B2d݀NC^ǝ@|am-Ixz2Z.NJ#L<ۘV(hOÁnYV ӭ($dB X}BE 8 NP&Sl2WzĒuT P9=}pɋ[-Rr>5\6$SV ԏέ\k%=XI6FjjH@ 'sf:ڱ29 YOEww=<;TS(6ca#t"?БY *B80śS`5&щ l5WӰh3+0y=M s'[iv4c666e:nmDZ)_I3;بllR˭~jc\N7e{b:YtߜH$Bo7 wp:aKv > 8XQC@GΤEga=]HkVg96mps(&0O<vkwΎjYk zjO$ADP ~Wk!x/A ʼn$Ŭ)eOYmbQ*qT$9q%Z #]Ѿ,/?KlQs>NSAbJ6;&)Sf.2iShgt9Oև]="clDNOU ̃A;0' uly^?:{{GxUY}hwv ;!R%$騋0'2>nm8rҘYhN+l#b9Y3z1! BM$Ja nc x˽%%h>l߸_Gyӄg?a89<{[^;׽^&i6Vü掿lT5뺚cocV 5_ BaPJW y8yK-x4ċAb.07孷ao<|ŋF  '["K X6̷  YI'@PX.XL(V:u zȯ(n_ -,m=K,0AQ# ¤IJ$) BBHB`gLDꁓݼ͛)McO {W0ӀDڐ y!>gȈ%*ږU/J^lP}aP- –oD[w(hd[I2~bkc Nu,[l&.9. AJ@E4Os:M5T;éɴRE+1%vd$DcLI`Y!:l=y=۫ jݕRKZܒZ)竒Im6!bvm,c&a$`Q8OjbvN)/<46K 6l:@9|#T:A)!\RM+ , ulZz]&›} Wxqwڡ|u !cHA18G~] =R3ވ>ߑGAȈ?B4Bg?1]j+wf '2uZgPJb nc5$ 70yCx-%`ߕ ~`6F!&7 Nj]MD51!%:1;ZUA8W& }YIkW e|ekq{8MWXe8])`;yp;Dm;@JH4&e#fod2JTQBFDhY1 suh(4<ٽWEwF:sP#4S jwJƤHlc7M͖8e'i-VZvy|llmq'l5v:XRXB6'4+TǎY"%u*εA42*D34rǬiZyv17 M?,4THf*(x;fQүά*dN]Z K#SR)Qu;e8 rmg@:BbG#L +=+ 3 `H@ҢT\{y V]maaOk gbs ~j=6ލ "DêX5փ Bm𱻫te5W5(MjZˆZrzaC1 .m(SfJAEL | ϻXWTK4’/Ue'fBmc[d.ѹ4m Ƹ,m]EHD\~(Zqj,%pC\6rMw 6Hs<e'owR6 f[QF_^^?B=:1MeZ K)Y '>O操2&H !%:vq<|Qm| %cx]rE-jyB0:nXoy6q(M3~-TF_d2P#r юA .eZU(Ly^TwIgGz?uR2 . U MבwR o:\Fr^ᶰ~r*^gշ/G  ̨:, #;!m*Xϱu%]=X1)D4v-&6Bb-xk?.&݂9d`6?/eܖo\JƓL/d|0\.h UZO{t$QXz~=*okǣq94r̗i=IND% AI+Ƌ-]Q)=4ݥZg~gtwP">rw 0{%e{eGto/;nʽ4haro[rw;GG:)z?Ւ0AH֖ܥcZrۼ<^fDk5iy2v4J3 aBgtƤRFWCz d, `O`%ةemm3vNwRU1^m[ܱe{{jl6"rB"V]Zffh[_zReD}Վ&(wn|+ӹQ|{X)mj\19 JDe}ܚOG 6 |O;[Ʒ@O29ab`Mkp3to2'lt'>I~H#NkY!C"bQTilO|dLR/6R㼏.76 6Vbo>W1ڙ}AU <}/T[Qͥ n/j4=sk5}ߥ˹v;FX~Bx{߉0Zfa֯3hEOYP6^E/а\7tͼ&ۮH[7]0ItȞ5ѐ8j.fɟo(L[#)1wip8;4oe^V|iJ;;jt:p9Ef.ت{,ڔDs11$YLvڭx[-ڲs[Ԍ7'ޖ?JiM;xr'"UIf,БbN-0S3g1Gk:(!Yeâ d%PYl4Ϻp38sM[l("+kL|+1O7ݟWNƎ|Hq7 ZǬ,WP K0pP.5fJ,--uG[”׳ SqV3Xl\\aזf㌆4c; ܡ;?) _(BB+Or\`0#BvNXBEB)! R_nI<}zD`jx)kY7a67~rc/2GJB|HNП+V *e!rڛ+ehnpFK#(sg[W8x3NAD,ƹo9qxI<8?#K'gG=fcG$[Y 9 !)vg x򴍭I8c˿xȆ~caa,6|4EYAye=ӞǞ ѐ'AwS]$hb"{}o}Hy% z9p(p:4w4e2kG) sKbvt-ҜlwIxUYhW>zIؚ+˸ \lnլuG6͹ܬW}8э`KntXG p7Mh/:.=kDH :{oʉ|>8vr$dSs?AλoD"IJ|f37Sf&+l$6KP#  9ǚh` #y=~hȖhIR9]!5BZb&#}@\ H-CjC tՐT;ow?QC>u53C5TIUPn-}or)T##K ărY2''0 Լ) N|URCT"2?ߟrJ"x=1nt0/9a鰋ɐO2,_ ,QJ'>_X"E1.Z(G,ayV燌3_ļrKWu]RxMЙ340P`$T069I'veArꍉ L\r`n U=[X x%6 g'47X `Y~ESS̊ӥFJHZ i;[v$k\S*tZ /ѲĈa)F_HCIo^|z|x}OffTO |(5?$$O +lscNn'1:¿~JaY;lt/ 湮1\hqPX"HSjݧ?-ʌ{,67/m ͅgX*'Ọy`qMFx|yU%iYN▽eۖ22fC:-KHge|P(.jQnhK%׬3jٹsǕHn$ɧy`;'RJ Sk `u ]j$ [+K A S`^cى B~S-EVnKjc + T"=+LJ&tLelNL>15ʫGR=3F&:=@Ō{h۟]-ENE(Kb<(zVl%ZHPf*W8u0|/J_ĵN=JPXX(]- w%178{=0yb0.yf/ +^|,l-?ZzUoJxaPX O 1s!c9&D xz#]=r]d Hw:8 Ȉyhm_ZŸ% ep~1X>`FK,1 \DcJ>Q7Ƴ򃣣g?*Vsr 93Ftk&ᘅ|xfe'&D\δ3 a.~ҵ{cܿ/4xngopAP5 /z@sظQT_@ ӝiQ4%g)_;:ʾiTkz㍆~ذe+ _ lo(QC ~K'Jg_Ic!W>]);_!\m9&bjÅu*K=Fq%0V{ ju;òl;紕LeYPŸM;5},|bO'*ɧtyRUZ-G??'LkyĠ88u+7 B" = sᏼ {YƮZ3!(NQXO귧pn<0dҋ80;[Y eFB CQ!+7T@B0J8vU;RQ"OCleH\$"l0@ |˲3䚈hk]'zKi\j5t[4}q)hE{|jNyYU\xsα f..lln l'Dr!uT.+1 n]OY-ܻ!k¼`p1SnD작s?M~Zu.•\N)/ /|*0F&Y~^[Kn&r 0\n~!"`F {. #^^]p\ )1';B{Bro-8B1\ ^gO+aIdxۤ1U7G3X2hFlhnr=Æ -Lc}tw;LbH%moǶBY^~//(U4Z&`@;\L9|&mE;HWdW3$=j芣60~aہa`tѼUZL~ǎtǸz Րz-˲#Pފ-,:WDґV,Et( 1,(;ǖ%}޾DE֟mɊב3 F<8{YcoAhSIpz.dZs 76a!>^98ƃƫ(*ċ&ғ^lQ/`5#*C7A1#7zv?~cO6}(D{q#tdQ(CHSIFv#2md0GSDPK(6U% s⾸0wF3JB,N Z499Y}(촅a^nhPOH5kL^ wEɹJ5Un.]#^:8tEb ֞_+4' ƭ=|_U_cĊy`EUYDvx6"$8ZDh֡tMu;"гHcAZ 7ekOJ2@To4b^YtMqrڶQ7n+!ւg Onb3qЯC[_)1rv$Y9Swg #<\Kڣ 1܇s~puv壹z{=.kŚk6 rHK7}{#9<_DNB&EA9DLG̉0_Q/Q ׃I*.Xɉ ySã.չn*Cdnz/=chl<_3*S o1כwW\ި3yM=\` hIQ'ID2mQHQAcc@#dE#Rb1Y(,,\ k,#Ia!cWB%9lzwycs5a&lv3̫an\Ye.U{yQ;7yGOlsvW< pw W6g8)|Q. ݅&ADs~T)X@[SM N B` 莕S0DTRuiú\DLMamVYcG`HyJ7r:yf׫g^Hl{Dh$g &si\2p=7?d"F FĪk:_L1'MX1F>/ܡ`*le[O+}jZN ׯiZ)}@QNuzH&*FrcW'*Ugr#-M@A)'Q8jx^klinDc\'7DcW}7 ?ZZZ)l#B|!KΧU &8tvC-xŎ=ɻ6ŇX!hn >H,`r1BL=m[M8S \^|`KFd2Kp/ ,Duc E$!>ta+z#'Jh6M4hy9ޞƯa懽+j?M駱}K}4L~5LcjK9 )R|n_Zb"Z*.X pU0€?`ȯ&5&PXV Oܖ?W{@SN;HzB}Cl`L,ȈN;<35<1"9x^/xc v'pt#;?[-&,P98O'{ X> 60Es"+4rDBj: r/TJDB!_KCMUZdRD2 X}n[[*ǰ3~j #"Q`lmG|p*"kѥjp!&8PD_)ĊdܡR+b i{FvIߪ'&I/~tnըDΈDCgEL#^j`ZQʺݴ\v]È\Quď/Ͼ4?B]%y"&ć*nkGB -Yo I.hPy.Qe' lI/\Z,\R6oϴZ*υ|/}$tbD)m&zvB/VydNm[V^EV%/ٳ/c #DK ֱX9bpѽ;\؋zܾ{PuE OJ*:F+7#zOC|KKtVI]}:{0~fLcT*S(mcH@Œ{ N:̏k W\u?ܶ 0#i[4 w(Y !!=_LhdN- V5[2P! I>igw|!D 7r`")NJBOD:dYcF^v޺ͦݵV6 s jA (txmۇ̱:d.u&9kjEva\*(/O yܵ\"BnzRP1%$"2Va!SPt'T;a(uU+G~yU⨞<'R%#!ÅryNnm[A躋++;??ogzG(!*!u$vڽpv17 $҂u%'IHI+JY2**LZ@L"(|J$Ċ~ aZNe}{ٶsoalY.ȴ!6 (GDP^:[f+m7VVڭfލg&W'ɟQUΑxt9=ڄi>l}ky_)X/׺/K O̿$(WU) aI\' ybSb?> b9dҌlųlߵm6 CNT%:8 ;;; i;e7tڎ\}.9o~ ʖTc?%C}$m}pRnw;BďUe%*wM{'JzBn/qF^٣ހ>xW~ \k;L 3n{۽e2ٲْҭnf+~BV&&Ys-ڿnowoHF5rL$+?OxQҮ av/vz]YIe:=utv fme1T0x]Y]h#GDB&?D_eoc^@ ;6⽈ P >%aꅳsZ׍qL_{^ne`@X Pa5)q.&GUMWu;#db}wxU\| \Hd¸F dcIg2xBVmzFoڜ^󖰑]AȐH|DD"DebC`(9?lO[@{'ED{ZG7Ny1QBO8B;cm6xzaO:\X坥??7jl, '0d !nFCȝ 7~w='q셫1V4>uNn7O}.qH]"dyؠM6D:d0\)wȑP6ڟ 4ȋiZ/qцژ11o9ZGt!X{ ge?h; n7=pEËwG%*!~Bd­ z~Ɩ_D=DeGhJʘMg#(&=G jʲDB"qcB\֍?F (4EZO˅cQ~ihkirbcI22f$ʩle5&~CNAZsj?|['2D3ЈDM"bG^r9~y4:~'̽ө5mMˍzQ>|ih$!\͎yC{!((CLUV$IV#@ H%Z|AQZ褷q!*{aؚMGO]>5MTIbz#&m1ɮa'oUJK&+DˆC`(%_Cvoܥynw[_1OYYNr UeuS*.'Yp~A܋ݩoNcjqs)Y0hJH8WP?^ 뚃.{2_du*_ܠ #:>c>Z;)X_-.pvnv zV(H1A\n2D^آh^T(xj0M7i!sH$S1 G*nݱomwlaSi㚁"尣Pб({A@73}M5+ٮ(ktT^kl.w?y4rż3HV,91^`J-]9T3]Xit4ա]V9-* 3tX@5`u,]ߏeGI# ,Hk;(cta|>IvTƕvjZ-(XŘ]ьP4E/%Y)2r]KmC?o^FYb3wDN_o[wR[SK߱5a9T!ɡH'_oX;]VS-(  \$ChE7%pE5rbIubHV3J;ic͛M敍q6TOux8ʅj,E (:oہ}f:Yg\"t!od ^# a,K@$jW{_tfȫ8[ Zײ]G BhaA`D8SW -= U*5-o}7𼴞]uGC= vPΰŷS3ju.} 4AoJ&?#{r-CԓXXʽ2'(kkWێsw6V$3X!$o7S+`ATyX*j'Z>(P|Lqzi޶4y:Y\qm]O`b8#_r<:Q[a|" 2@'xmëo u\Sm-nK$K\!а##.0)"S?<#vFMhKyB+ R~?.:I8n4qGcGo$6StHD䶩xlGMHHigfR7}:!F@aŠvI3FƵ~]zP*>.>o끩aH`TS6WrV A.DԽTݥ*M/Ūܴ'Fw-'^|3ϚSC]?2k}Ja$Kl ,TJߔޯThZzpRO^awoB3k2=TdA$;2|CRDTqh $+kW.xBo` +&QFO4~H~KTEe3,V_}mA+[a@UM&i)  \Lҗ|PTm,MlVzPJ) % -̶|9yj_,u!-~Sz)'4Lj.AXMk2xUY_?,EX!XMt!^q"d$&orWU!΢ e=w-1.-5tEP+ q %&&n!}ah37֝3;a "ԋ Aa*5yԙz1yJ6DI&@0Iԩ~?I+[qӜѸfoSCKGwU8ZKo :-?:aݳwXzC[DuOXKOP[NI 1FI)T$Hy }?.6m%x ISuEzI[fp2hfʕ=1 ׸>VS7sF۫b+p뫊йTqΚeG%*$n*anhhuMWW 2 1(mu];)nsamc e8h,'Ou\*M<7x z=?v+iN>u{5;uynzL԰earBA=OKЩ45sbg;s6TTH09YPw,Ŀ{#:FDk?wslXYR)ĘM&&)~{afI@|t~bKzߕ// rďy[ pnW"ׯFG`' H˧9ڌyrBR:?)J "ԌʱH[Mt+#R"sY?Oԡ4NM cK)8ڐvXDUȞpQKX9z=yݕ~X{MrjrAZr 1[f'5V8u,F&gPBaL ƟaCF*=eK_&O#Y9V{^;aXxq: vL#oaa$.fJ$y~olwFeX4v 1z@hss0z-ڥe:}egJ+ [b! >C YIECqRǽ{F=?+Ucp-AL Hz}XP!Ka񑛃2Jd2 &#uP@azL{$!c\.+ϧ'$瑃J9B0`0;ZpƟUFn!kfKDjtTofVX4>;nˢގ|)~xx}prC~|ϳ% Mrf(8IKsz) ЂJ{)T%03&d/:RMuWw˝5!PوAW3ה:'+^JZ8Q2Xzmr p:a|!cɼ0= >ys'n0Q`FcQ̀|9aTy Lɳʱx뭠|\,qcL2: n)@(r0@-74 J~i~Xކ 0KP i 8H!0N8qV"",2GTarE;JTΚ:HS(PX$@"ȒXD: $s ^W fiӎ>Yw8Y)ѭn1-ia'c>7_7u[q!9 QpH"kX S~efȒxx_Jv}?SI03 l¼ SJ =izuP=(2xoѣl:n glVT;G7M-9z]I_ _8WՉ0 FX#qvaUJk6VȀONdpbKgjňR(Ro&" wbW{ۢ*oY6-Yܙvo2@O0܂E%@66ojIp$Qꇎ|Hqb[C* @@ʭ)B8V{qXi~Իuaϕ 9ϲrc;&6ZUc[em>Q}N I)t7\XeMfNV.2N3?OyԐlc5Xq^QaI2~~O[B5bS{a 5 +`O@Qssfs4˾יx.)JVyYN"Og30f4a򃣑"Q0N/DP^2m kZ5>N`}:lxn%5#)'nj()f /fš5> ì3u.d~@Apz8:94^J`B02GC43.\B撡]bHJD gÇۗ|H>76Zr/0 R{@'igG_J&}O_,hRݭ)0jn^{?|:M 86T|EHW]v0$|1 1' Ӻ¥ 0}Xu)˓A ̒lHKXۿ"Dҡ/Ic/wɚ wGAĨnd[.Ql ZW$T9 (գ7)̔Omм rꥐABSfM6 MaDڟ D .YezZ%I:4ˤi Ok]*Tsn[9DMex s Mib^8ҹA&-bbz=ZkOъ},T"GԺŐRGո.ZjZ(n`B."T8eC ݻykw$g2uZ"RCڂIø5 0(G1c ihO{PؐZZozmqu}4_2'`Fw:XDxWOYgvCʔ]J,X4#Jhp߹?Oal 'md9#E{b٬ 703.%Pܑ{~ $[ѷbȲ4 &lӳet eBlծbro뵏o^XqP[t0THQ'J@ؚ+Dx;[ KKf{7!q8z<-I$aD8X͊ƣ.юJ/,Jj ֬nn?.} %ӣx:byfaH & n^drO0gQĆ[Er^lCQ49afdr)–mR59xg0N1t9o?sO~Wn+kexr.%ҶK9@ 0D\)YFϓ Ŋ$>8SØ'UGCRs.u 0E Aj>&NHyѷ~"y00 `O}*c(r,LW PKBal꺗Zprl晋FJ?¾j&v7nM7 hFQwƮFP@Hv'DCw_oP%ehoeiȩ#ԑ I]!~0ّp8/g@? 2[bp2B.zŞVJt* bNRIP%M_Nǟo=Z=?m#zW'w*1K//<:XZ ƑcR0bګb2G`=H3XؐW[lu2s٥ TFZ& nz#oB<[|y2ÙU{5Sӹ%ѭM~*΃DŽ@yG>Zȼ`C2c{L6֕eR6lxeY=YFp4f0b&D8 lbhlh3`nl88a*d"dV;<@  VdfS"#Utܰ}oUٓSUW_k4W/ʯ}Sُ>٫7(寁nq_~=?3~cڧ4>y/ 4oVFg~G6[E[9WV;*!.<+6U@- n@txKC&MHd]oȓN=4@f2,tͷkdBز +g jڣd!\uO #O/o[Ma0!hv<^&Lmw/\v>k ݯ85d&Pg|$ Mp2J QDjbXI}00(z9 [5Pҁ4G8g!c8ıWxR0[PFI0'Kp`9Xx+0^ ,H ÕRK5(9lF+`B@>i+1e a &9.N&GFD-r 'k4abXç${Kbx [DA)IR6%5q6!B䃄ۄC-xW "hyN#%Ƨ)*1ǣFkqtMX%PsaQe,0耜eZë T VH0R)e2̕]j͠H_8DL.dDA"녰3$ \0hERrMXTfsqH>n5Te-rJ,*`On Py]j pi5AG5il u4ˍ 5L?;vJxGJ?oRK9T/~:T$TmC&cr0M2cT+yPM*`BeYtժAq}!=p2dEb|v&P)J!2)~wۨJ.W^мy. :QW$&q(.jLkbu@u:і@sЅ_(gMFX|+"2RI9}\"lKz ͠S/nkBFi2 9RQ32H0`Q|xa?hdQlT,T/ja~|l7;j6w>--fX///`UOM'fis*dLzSUs |Å{k,Rt3o…{t8.I6CAg(QܿYPm[.xH|Jv6gwvbg|gtq*f%E9,f>7"ʖ˓IGŢ~m?ř1%p4*@A*1' VjFpgl.WQ6/6۾]@*{zDWy] V*!T>u)'gxV>ڍ,Nc;˒cn_ivڝ0M0Y}$F͍E6-"^`eq,=jhQ2x8\]zUC6R;EAD/37 g#nL 0'6Gx'߈j-QLM0`n[)\;k96DMޮu_$ge[ykmZ=:˗ǏōS闻|Ӟ@L`VFΒخY>Y6~t\.$˖ٲlT+T6C~r?Š/b.j>~(_>)|ж*U1H?lؿg(t : |eڤ~3붺|ROYv\/7֟M{(6hcUQkze'ӻxbw|ZO[:jvI;mAaǫڃhV*6IJ?5vcnakg8q-Zo۵.tFStZ%<5Od>uF@?w8qϟ|)+ V;.[κ뽟8y;M{GdkZ?_7=uh1PJzk|Ոnȏ~~?=m u8y,GwZkwӝ:Wub5qtwyw#4-E~_~FA#rT'-.ăH08!xѽs/Qn8,*X|fs7/"'E6Gʈ7smϥ}O^:^ZgGz,_A;Wvޝ-'(:#t;N(''}s8}d7^TQ7S|WWߪ>~Y~ ??NyOoSN81_ᦁLa‡薚|o;LM}FFxznbϋuqS9ޟ-KQY:i[tR +xXp^RJKBb'e };@q,Bz$FŁGpCTqg~y[8wu[T+^||p wMo~ CS/(t1>~8UJUjze´`w3gpU,pz=B̊t<(iSi6As(!y$]:Q1(ȩ|>_e-UB#fK[""Zu=ԤO<ÕCS0jWixh NJ,˵RT?F]U=x|p xbt﷼H 6g;?atBm.OGxYhC/˦Ty7j۸+'hJQ R/ZTz hWdklf*  %b񤉂 u!bˌn6~y3D "$ykB"i(?7YgN~4uxA 5ց qz\wΛsއO睫q_~"rcس, (-P@^IJ(|a vlAhoҽ7z8^%-peN@T0o|sAG;0;&OEKKom\^ dœ/]~ge ;"ȚQ>#̬pq;;zł ަrG5BD̖I>O,\~ Y]rt3:Q[mfJ:@-,ϊ6rM@o~oMP.{?Rx{7m j3@L~*+zmJ/*Bqp/#{0u iRC 3@AhZ^KZ&N]nEOw#%G&69:.Āwp, k-p8æ"֭',[eahz}umM&FwfQ=6 &[4JEPt`%],x[zޯ vƖZP_庪$;l(`*ȡXb/\XssEx@j$YQ!.FN׌$ x R.~̶6Y=$ 3֞j Ku샌hiQyh5@Os-+UɲQ$zoo*Fao.eVɨޚ06gv>J;!k+HӐ^A4_BpnוS+j_m^RŪAsUiws{ťbla MUt݆!}Z="r(h'IK`Lߗ 9ZT9tc>n B@aUx<rĥf'aî7X&Z^KZV7Xj6CZLd]rD.?6hnfs AO'ZOz:ȡjerl-FB.aoh#n,kKuIM/~|& 4R=>31d&U$)C#Q|4v=ƨ+J9fwP'rBlk=+ur^$5,]0[-c$Xd d G^IA~/I]^˲ɤQKďec֖p1)_0 1竰O(z|fX&$.Cdg5lR#nHߙOŪ"Ue˂j2Cm%;%Z4yG*-+s5Ae (eɜJJAIrMT-Ed}$|z=U$ >,r{ľOSҨ-Ur|c !AQ] $hK*uj'j@WPMUMhE㻆LTc껠{#yTĜʱP&/cM#Y4yhIurе%)l*_n/Ȭ(LxiDH|_F yk&Դ Bw .4z~[qQdd緔KEexiaY/FY fGeNU흃!@EɮՒ&v} / Ow }R]OoRfȷ|Kj3 ILU[݆m 7&Tc?Re=Icڃ wGhVj!hgaRҿB0 };;_Y4ɕH*i<}q1$k2@Ernu'}b!F=gRmV%xc]F96B"#HqK@a@]mu2 FBS+Ӌ`pedv7C tz_wǤP7Sw&,Ou;r!{hŞՉ|fB0DO\ڈ$s !֞pGuԗc Q ![[F\\B/b$,C?Zir:_IVB~ЌU?~)k0T_k7NS(^pGwwcQd7ÍQ,FG ^N|VF%&kftNyj⮽^Xv\_KD(8< /\"Z#R%, d,'#Ţ!Yo,Y1t@MZ-.we|`P^s)e׆vqv]5+Gld չY`ςY2PW8u-YV^՜ME|"5 X:sEIC 1qAO$:#I͜ԉ iʱ&g U%r._#'GLYi)rVDBK =@y|SZƮi@X#w 86$  Zi[ᆜ^y{ ɂ}av,dOߗjģpζjgn(U`&9ԽBBAu<vv' SdOuJ5 ,+͎-ms3d ǩ0d =HMU\1rXh8YaQ .)u ``*R$+8UeuRtTNXbx',T]Q/Eq/,W:I:xF^VX0XjŖĖe, WpUv`zFG_v^wUJhS=3qQHMUӜ WMؽXe_n.Mn/Fbۗygdalautotest-3.2.2/gdrivers/data/isis2/0000775000175000017500000000000014020414072016455 5ustar evenevengdalautotest-3.2.2/gdrivers/data/isis2/arvidson_original_truncated.cub0000664000175000017500000000725414020414072024742 0ustar evenevenCCSD3ZF0000100000001NJPL3IF0PDS200000001 = SFDU_LABEL /* File Structure */ RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 512 FILE_RECORDS = 139 LABEL_RECORDS = 4 FILE_STATE = CLEAN ^HISTORY = 5 OBJECT = HISTORY END_OBJECT = HISTORY ^QUBE = 8 OBJECT = QUBE /* Qube object description */ /* Qube structure */ AXES = 3 AXIS_NAME = (SAMPLE,LINE,BAND) /* Core description */ CORE_ITEMS = (43,1 ,1) CORE_ITEM_BYTES = 4 CORE_ITEM_TYPE = SUN_REAL CORE_BASE = 0.0 CORE_MULTIPLIER = 1.0 /* "true_value" = base + (multiplier * stored_value) */ CORE_VALID_MINIMUM = 16#FF7FFFFA# CORE_NULL = 16#FF7FFFFB# CORE_LOW_REPR_SATURATION = 16#FF7FFFFC# CORE_LOW_INSTR_SATURATION = 16#FF7FFFFD# CORE_HIGH_INSTR_SATURATION = 16#FF7FFFFE# CORE_HIGH_REPR_SATURATION = 16#FF7FFFFF# /* Suffix description */ SUFFIX_BYTES = 4 SUFFIX_ITEMS = (0,0,0) CORE_NAME = RAW_DATA_NUMBER CORE_UNIT = NONE TARGET_NAME = VENUS SOCET_SET = "LAT_LON" GROUP = BAND_BIN BAND_BIN_UNIT = NONE BAND_BIN_ORIGINAL_BAND = 1 BAND_BIN_CENTER = 1.000 END_GROUP = BAND_BIN GROUP = IMAGE_MAP_PROJECTION MAP_PROJECTION_TYPE = SIMPLE_CYLINDRICAL A_AXIS_RADIUS = 6051.0000000 B_AXIS_RADIUS = 6051.0000000 C_AXIS_RADIUS = 6051.0000000 POSITIVE_LONGITUDE_DIRECTION = EAST MINIMUM_LATITUDE = -7.5220242 MAXIMUM_LATITUDE = -5.5449362 EASTERNMOST_LONGITUDE = 97.2867889 WESTERNMOST_LONGITUDE = 96.8064728 MAP_SCALE = 1.2000000 MAP_RESOLUTION = 88.0082240 LINE_PROJECTION_OFFSET = 488.0000000 SAMPLE_PROJECTION_OFFSET = 8465.0000000 REFERENCE_LATITUDE = 0.0000000 REFERENCE_LONGITUDE = 0.0000000 MAP_PROJECTION_ROTATION = 0.0000000 CENTER_LONGITUDE = 0.0000000 CENTER_LATITUDE = -6.5000000 END_GROUP = IMAGE_MAP_PROJECTION END_OBJECT = QUBE END GROUP = MAPLAB ISISVERSION = "2001-05-15" VERSION_DATE = 1997-02-18 DATE_TIME = 2001-06-08T12:56:21 NODE_NAME = "henry-jr" USER_NAME = "dpwuser" SOFTWARE_DESC = " Puts map projection information in labels" GROUP = PARAMETERS FROM = "ovda_arvid_grid_1200.cub" KILL = "NO" PROJ = "SIMP" PLANET = "VENUS" LAT = (-5.5449362,-7.5220242) LON = (96.8064728,97.2867889) KM = 1.2000000 DEG = NULL PLAT = NULL PLON = NULL MAPROT = NULL CLON = 0.0000000 CLAT = -6.5000000 OFFSET = 0.0000000 POINT1 = NULL POINT2 = NULL END_GROUP = PARAMETERS END_GROUP = MAPLAB GROUP = LABELS_PT ISISVERSION = "2001-05-15" VERSION_DATE = 1999-04-22 DATE_TIME = 2001-06-08T12:56:22 NODE_NAME = "henry-jr" USER_NAME = "dpwuser" SOFTWARE_DESC = "List cube label and/or history" GROUP = PARAMETERS FROM = "ovda_arvid_grid_1200.cub" LIST = "KEYWORD" DEST = "BOTH" LISTFILE = " " BAND = "YES" INITHIST = "NO" KEYWORD = "SOCET_SET" KEYVALUE = "LAT_LON" KEYVFILE = NULL KEYINDEX = NULL GRPNAM = NULL KEYTYPE = "STRING" DELETE = NULL END_GROUP = PARAMETERS END_GROUP = LABELS_PT END E EуFE9EӐEՉMEItE5EE_EѢ8ECEEEpE&EX/EɮEA8EʒE ,EtE>nErEɧEɪ.Eȁ_EEˎE̓2EEhEOEE̚"E1E˒ElEvE*8gdalautotest-3.2.2/gdrivers/data/paux/0000775000175000017500000000000014020414072016401 5ustar evenevengdalautotest-3.2.2/gdrivers/data/paux/small16.raw0000664000175000017500000001036414020414072020377 0ustar evenevenk{skkk{skksc{cJsRssk{ssk{{c{c{sssckksks{sks{kssksk{kZ{ckcsZ{{s{s{s{kskssckkkssssssss{{{kk{sckc{cssckss{ksc{skscZk{cs{Zccc{sc{{ssckk{ckkcs{s{{kssksc{cck{kcccsZ{sk{ss{s{{csc{sskcscJ{sZsksccs{kksks{{k{kskscsk{c{kcs{{k{{{ksks{ks{{c{{{k{{ssZkkkkkc{ss{kc{c{{c{{k{ckksskckZ{ksss{sk{ccsccs{c{ssc{kkckZkskZc{sss{{sc{kckk{kkkscscckssZ{s{{k{{{ZsZcsZcckccksZs{sks{cs{Jsc{ckkskksk{{k{k{RccZskkkkksckZscc{sZcsZkccZckcc{k{{{kcRkkkcckZckcRss{Z{k{c{{sR{{{{Zcc{sks{{{{Z{sss{{sssZ{{{sks{{c{{{{Zc{{sR{c{Z{k{ZckcRssk{{{kcRkkkcck{sZcsZkccZckcc{skkkkksckZscck{{k{k{RccZ{cs{Jsc{ckkskkssZcsZcckccksZs{sks{kkkscscckssZ{s{{k{{{ZkZkskZc{sss{{sc{kckkk{ccsccs{c{ssc{kkcc{{k{ckksskckZ{ksss{s{{{k{{ssZkkkkkc{ss{kc{c{{{c{kcs{{k{{{ksks{ks{{cccs{kksks{{k{kskscsk{ss{s{{csc{sskcscJ{sZsks{s{{kssksc{cck{kcccsZ{skc{sc{{ssckk{ckkcss{ksc{skscZk{cs{Zccsss{{{kk{sckc{csscks{{s{s{s{kskssckkkssssss{sks{kssksk{kZ{ckcsZsk{ssk{{c{c{sssckkskk{skkk{skksc{cJsRsgdalautotest-3.2.2/gdrivers/data/paux/small16.aux0000664000175000017500000000032414020414072020376 0ustar evenevenAuxilaryTarget: small16.raw RawDefinition: 31 35 2 ChanDefinition-1: 16U 0 2 62 Swapped ChanDefinition-2: 16U 2170 2 62 Swapped UpLeftX: 440720.000 UpLeftY: 3751320.000 LoRightX: 442580.000 LoRightY: 3749220.000 gdalautotest-3.2.2/gdrivers/data/n43.dt00000664000175000017500000010256214020414072016447 0ustar evenevenUHL10800000W0430000N030003000200U 012101210 DSIU DTED0F18 062 01A960900000000US090078 SPEXDLMS2009609MSLWGS84AS11+C 9609 430000.0N0800000.0W430000N0800000W440000N0800000W440000N0790000W430000N0790000W0000000.0030003000121012100 ACC0200020002000200 10 ~(%%(0<:::<BHNYb[]][J3TX_cdgcjofn|vt?}a&D6}~   ! (!0>;=3;7NRbZYZd\R8GTWYXklndjptr}6Fkh7By "%10665@KLTYTYZb`:2JIOPSWba`clpi}FpvOBݪ}wq   +$%(.138LGR]YSNH:46>GH:<SVk`^hmip #7aurwU?om_   &/*4(6DTSLQ,A)1++)(%-K[H2]ffnt)0Ts`]rS,kcVVy 5,<'   ',*0:OdtvWVAPEB.CM l`XWb1<5;     !1NId`T>=MD8&BN jbYKe:A@2   "&$(07JV}r]SZ>:HE6"@g ha[Ka~ - "%$'*) $->Lb}w[]JKM:8D<1B iX[KUw     !##+-&01D[b{qh_I=GE52962Dw jYU]cT ""%,."& +%7B]qrgdUE4;>32745Ci_[KKK{  #'+$#%%"!-5CPif^SI:7@/'/35Bi`QKKhb   !))"%'&))*5<ZSWG@99:0203 @bZMKKi^s{  $((/%&.4$+BNGZF;"(.+7.) @2]SPLKKff}))'&$)'13&61D=3+()'!6,"DXRNLKKQdju !! #'/)-#*"5**"(,,0&Eb}VPLKKKK^`iw &*++$($!*01'D_VNMKKKKU]be~ '(/-! $'+15"B˪[TLLNMKKKZ`bmw"+-.0++.'! 0#&,* DcZVLLNKKKKXZfgr| ('(%!!%!+ BskbWVMLMKKKKT[Zfjx   &* &,$ @uri`WTLLMKKUOK[U`gv{w   2;." @Fq^`WTNNKKQKKKKU_got    7hB*%CofRWSNKLKKKKKKV]cipz     8`Y/*"FocYWSMMKKKKKKKKX_dgu|}    /LN/.-,G?h_YSXLKKKKKKKKKT^ebir{   *;#0(0&HgVWQMKKKKKKKKKKK\Y]bkt   "3#(%.HcWMQKKKKKKKKKKKKK\[_akyw{w    #!Iª`XQNKKKKKKKKKKKKKKW\`cj\y}y   !   H| aVPMKKKKKKKKKKKKKKTZY_Tkut  #"  GL!!aWPMKKKKKKKKKKKKKKKUTX]ekp %I""`VPKKKKKKKKKKKKKKKKKRRZ\dhq|"% K##`UOKKKKKKKKKKKKKKKKKKKTV_biqq~ *! I$$d\UMKKKKKKKKKKKKKKKKKKKRPY[ekyw $"I%%aZSKKKKKKKKKKKKKKKKKKKKKNVU_e\k}z ( E&&aYRMKKKKKKKKKKKKKKKKKKKKKKQZ]Vdm  .;% FR''`WRKKKKKKKKKKKKKKKKKKKKKKKKVXW]fjsz '0=" Dt((]UQKKKKKKKKKKKKKKKKKKKKKKKKKOW\aeklv 3?C))]UKKKKKKKKKKKKKKKKKKKKKKKKKKKRV\^ce~}ru~    *1B'**m[TKKKKKKKKKKKKKKKKKKKKKKKKKKKKQR]`do|}rmy    A++cYSNKKKKKKKKKKKKKKKKKKKKKKKKKKKKKS]_hilijpR}  A),,bVSMKKKKKKKKKKKKKKKKKKKKKKKKKKKKKPV[geebfi[o*@--bVRLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQX]da\aaZknw # EC..aSQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQY]\V[ZcNgjqy,JB//aUQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKTUPUYV]_chnx  '%M,=00]VKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQWVW`dkq %2V  :\11ZSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKPPU\ahnuz %*Q%0+$:f22XKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLSX^gknuww~ (,*$F4890,833ZKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSW]diknur} +,1-EJ=81";44ZKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQYafmejs} ,(34FF0(#:K55aXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQUZbiirw}{#8@U4)  966\UKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRVSgkquz (.0M>JB877f[KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKZejot{uzz !" ++.>FN4+7٪88fZKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKUaflqu| &)%"*'-:EJ8:799gWKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKU\ajmqtx%)+%(!$9:VL?7::jYKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSY`hkqwv|f~|{z !,.7)- "!+?60A6,;;yaXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKV]agmrutvf`r~{;&*)(#"<:2*@5<<gZVKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRY_a^klTxcny|+ 60/+4'0:4 ==vcXSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKTV[fMStyivz|!?930# #8% 6>>i`XOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK[c[nuxgui?<52!%8 6e??{d]VPKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKPbprvwz0?77)!%(7%@@x`YVPKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKNcswy$/<1*#.< 7AAo`YUOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKPalu ,81*&2<!  6BBr^ZWQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK[low#6 '''?8FCCq]ZWRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKaiou"&4*$-;"8wDDt_YWRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKV_gmu85$-(8EEl\[XRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKS[eku$%61$(#%8FFj[YWRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSZ`iq{,-3-,( 9`GGf\ZVSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKOU]hrx )("2&:'8HHob[ZWSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKOZfos %9%0+"9TIIp_\ZWSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLKNW`kp{  )08(8.JJi`\\WKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKMMKNQWmie| ,/8(8\KKcNM^KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKMKKMOTgpv  $3808BLLwdaKKSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKNRefV{u}  !:8:8MMxgb_`_KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKNKKNNOiWRnz ";7E8YNN|h`^_]KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLXpuwVdhy 7=Z8OOWh`\_^KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLKMLMQkt{ebq 6:J8PPxt[`LK_KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKNKKKMQgs~]|z}%9H8lQQxneV^[^KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLKLNM_q~}[}|9L9!RRvwpea\O_WKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKNMYtq~~6O8SSzWNgdab_]KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKMN]{m}4V9TTyrphd_bb]KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK^z 1E8UUzkytnjdcab_]KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKh~~ *E9OVV~r{wtogfeWb^KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKi~ &=8ǪWWktwurggecKU\KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKW:9ªXXaztsihWe`[QKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 79ŪYYXsqjZic`^[KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 58ZZwOpnnjea^[YKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK -8[[sjhmlhb`\[KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK $.8\\xknomhd`^[XKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKN#38]]}stmljea]\XKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK "08 ^^yurkifa_\XNKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK !37__{wslhfa`[\VKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs #18P``ytngfcb^ZXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKw 6zaazwshfda_\YKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK|}hw 27bb|xqkfea]^SUKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKpx}6cc|mjffc`_[[KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKquy}} %7ddxojggcb`]XKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKmnrtw~ $27ee{okggdb`^YLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKePiz}fg%77̪ffqkgfdca_YRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKY_ct|q 187ʪggskhgebb`YTKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXefrw} 27hhxkggdcb_YUMKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXfcn}~ )7iitkgfdcb]YVQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK[Ohzx~ #96|jjpjffd^d_YUQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK^_kqs ;5_kkpiggcdc_YWPKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK_pblggC6llkjkgeed_YVRKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKTXV]]lj{$5 mmpkkieee`ZWTOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKTVd\ex-4nnomljffe][XUPKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSX[`Vlqwv23nooapmljgge^[XSQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKOR\`TS^ap~2pp_pnlkhgg^ZYVKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKPXX[\P\[hpwot3qqdqrkkhNLaKKPKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKS\]Y\O`h^db3nrrRONNNN]SK[WQUXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKUSZfWgjgtn| 2ssQ]snkihe_\]YVTKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRKYM\]`hiko|2]ttpnkiid_\[ZWSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKRXVddcebhx|~5Zuurnjihc^\]WXSKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKYWdhfitvswtty5nvvtonihd^[\\XTKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK]^[dahjejeq~5wwonji^_[YVSTTKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKU[XUeYYfinn~4xx~fda^XYYWTOMLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQNNRUbk]`oz}3>gdalautotest-3.2.2/gdrivers/data/usgsdem/0000775000175000017500000000000014020414072017073 5ustar evenevengdalautotest-3.2.2/gdrivers/data/usgsdem/4619old_truncated.dem0000664000175000017500000004164314020414072022745 0ustar evenevenRealWorld Data, L.L.C. - 1 Degree Terrain File Format 1 1 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 2 4 0.684000000000000D+05 0.165600000000000D+06 0.684000000000000D+05 0.169200000000000D+06 0.720000000000000D+05 0.169200000000000D+06 0.720000000000000D+05 0.165600000000000D+06 0.790000000000000D+02 0.160000000000000D+03 0.0 00.300000E+010.300000E+010.100000E+01 1 2 1 1 1201 1 0.720030000000000D+05 0.165600000000000D+06 0.0 0.900000000000000D+02 0.120000000000000D+03 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 101 101 101 101 101 102 102 103 103 104 105 105 106 107 106 106 107 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 111 111 111 111 111 111 111 112 112 112 112 112 113 113 113 113 114 114 114 114 114 115 115 115 115 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 114 113 113 113 113 112 112 112 113 112 112 111 111 111 111 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 109 108 107 106 105 104 103 102 101 101 100 100 100 100 100 100 100 100 100 100 100 100 100 99 99 99 99 99 98 98 98 98 98 97 97 95 95 94 94 95 95 94 94 93 93 93 91 91 91 91 91 91 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 93 93 94 94 95 95 95 95 96 97 98 98 98 98 98 98 98 99 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 98 98 98 98 98 98 98 97 97 97 97 97 97 97 97 97 96 96 96 96 96 96 96 96 96 96 96 96 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 -32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 -32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 -32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 2 1 1201 1 0.720030000000000D+05 0.165600000000000D+06 0.0 0.900000000000000D+02 0.117000000000000D+03 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 98 99 98 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 101 101 101 102 102 103 103 104 104 104 105 105 106 109 109 109 109 109 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 111 111 111 111 111 111 111 111 111 111 111 112 112 112 112 112 112 113 113 113 113 113 113 116 116 116 116 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 117 116 116 116 116 112 112 112 112 112 112 111 111 112 111 111 111 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 110 109 109 108 107 106 105 104 103 102 101 100 100 100 100 100 100 100 100 100 100 101 100 100 100 100 100 100 99 99 99 99 98 98 98 97 96 96 95 96 95 95 94 94 94 93 92 92 92 91 91 91 91 91 91 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 93 94 94 94 95 95 95 96 97 98 97 98 98 98 98 98 99 99 99 99 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 99 99 99 100 99 98 98 98 98 97 97 97 97 97 97 97 97 97 96 96 96 96 96 96 96 96 96 96 96 96 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 95 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94 94-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 -32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 -32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 -32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000-32000 gdalautotest-3.2.2/gdrivers/data/usgsdem/usgsdem_with_spaces_after_byte_864.dem0000664000175000017500000000400014020414072026421 0ustar evenevenFILE WITH SPACES BETWEEN BYTE 864 AND 1024 1 1 1 10 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 2 2 4 0.165850101709817D+06 0.000587469481022D+07 0.165738167974383D+06 0.001974384302172D+07 0.176694719320732D+06 0.001983977339906D+07 0.176825312372784D+06 0.000597052120290D+07 -0.100000000000000D+01 0.328000000000000D+03 0.000000000000000D+00 10.300000E+020.300000E+020.100000E+01 1 1 1 1 8 1 0.165740000000000D+06 0.001953000000000D+07 0. -0.100000000000000D+01 0.200000000000000D+01 0 1 2 0 -1 0 0 1 gdalautotest-3.2.2/gdrivers/data/usgsdem/39109h1_truncated.dem0000664000175000017500000004332314020414072022556 0ustar eveneven39109h1_grd 39109h1_grd 1 1 1 12 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 2 2 4 0.660060000000000D+06 0.441536000000000D+07 0.660060000000000D+06 0.442946000000000D+07 0.671040000000000D+06 0.442946000000000D+07 0.671040000000000D+06 0.441536000000000D+07 0.152259997558594D+04 0.225310009765625D+04 0.000000000000000D+00 00.100000E+020.100000E+020.730500E-01 1 2 2 1 1 1 1411 1 0.660060000000000D+06 0.441536000000000D+07 1522.599975585937500 0.171347965748291D+04 0.171501370773926D+04-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 2634 2623 2620 2616 2613 2613 2615-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 1 2 1411 1 0.660070000000000D+06 0.441536000000000D+07 1522.599975585937500 0.168740080312500D+04 0.171698605806885D+04-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 2256 2263 2271 2279 2287 2296 2309 2320 2334 2345 2363 2397 2453 2498 2538 2589 2661 2639 2631 2517 2517 2528 2533 2528 2589 2613 2645 2639 2641 2642 2642 2643 2643 2641 2641 2638 2638 2639 2638 2638 2637 2634 2632 2637 2634 2628 2624 2617 2612 2608 2604 2602 2604 2606-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 gdalautotest-3.2.2/gdrivers/data/usgsdem/39079G6_truncated.dem0000664000175000017500000000603014020414072022522 0ustar evenevenBROWNFIELD, PA - 24000 LAT:: 39.75 LONG:: -79.625 SCALE:: 24000 SDTS2DEM v.0.013, by Sol Katz (11/98) 2 4 1 17 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 0.000000000000000D+000 2 2 0 6.070921250000000D+005 4.400548000000000D+006 6.068983125000000D+005 4.414421500000000D+006 6.175883750000000D+005 4.414578500000000D+006 6.178016875000000D+005 4.400704500000000D+006 3.100000000000000D+002 8.470000000000000D+002 0.000000000000000D+000 03.00000D+0013.00000D+0011.00000D+000 1 2 0 0 0 2 1 -0.100000 1 0 77 1 6.068700000000000D+005 4.412130000000000D+006 0.000000000000000D+000 3.100000000000000D+002 8.470000000000000D+002 349 349 354 353 353 355 357 360 358 358 362 362 359 360 360 358 355 356 358 357 352 353 355 359 364 360 358 361 366 368 372 375 376 380 383 385 380 376 375 380 384 383 381 381 379 375 371 367 360 352 347 348 351 355 361 366 367 369 369 372 370 367 369 370 366 363 362 361 362 359 353 347 336 334 337 336 335 1 1 148 1 6.069000000000000D+005 4.410000000000000D+006 0.000000000000000D+000 3.100000000000000D+002 8.470000000000000D+002 338 336 336 337 338 340 338 335 334 334 333 329 329 333 332 329 326 325 327 330 328 325 329 331 332 333 335 336 334 332 335 334 331 330 333 332 329 331 334 333 330 329 333 337 340 342 340 339 337 337 340 341 341 343 346 344 344 346 346 350 353 351 349 350 348 347 345 347 351 348 344 350 349 352 352 353 352 354 355 353 351 355 356 356 357 355 356 356 357 358 360 360 356 353 357 361 361 360 363 365 369 372 377 378 375 376 376 374 370 369 377 380 381 381 379 378 376 371 366 361 355 352 353 353 356 359 362 367 371 371 373 370 365 365 363 361 361 363 361 358 354 350 345 340 335 334 333 333 gdalautotest-3.2.2/gdrivers/data/usgsdem/fema06-140cm_2995441b_truncated.dem0000664000175000017500000000200014020414072024606 0ustar evenevenu299544_1_a DEM derived from LIDAR data, Sanborn -0953334.4196 0292028.90687 CONT 1 1 1 15 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 2 2 4 0.248500700000000D+06 0.324859430000000D+07 0.248500700000000D+06 0.325250730000000D+07 0.251479900000000D+06 0.325250730000000D+07 0.251479900000000D+06 0.324859430000000D+07 0.114999997615814D+01 0.195900001525879D+02 0.000000000000000D+00 10.140000E+010.140000E+010.184400E-02 1 2129 220062006I0 2 3 4 01 9 1 1 2796 1 0.248500700000000D+06 0.324859430000000D+07 1.149999976158142 0.13159gdalautotest-3.2.2/gdrivers/data/usgsdem/usgsdem_with_extra_values_at_end_of_profile.dem0000664000175000017500000002000014020414072030554 0ustar evenevenFILE WITH EXTRA VALUES AT THE END OF THE PROFILE. 1 1 1 10 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 2 2 4 0.165850101709817D+06 0.000587469481022D+07 0.165738167974383D+06 0.001974384302172D+07 0.176694719320732D+06 0.001983977339906D+07 0.176825312372784D+06 0.000597052120290D+07 -0.100000000000000D+01 0.328000000000000D+03 0.000000000000000D+00 10.300000E+020.300000E+020.100000E+01 1 3 00 00 0 0 0 0 0 0 0 0 1 1 8 1 0.165740000000000D+06 0.001953000000000D+07 0. -0.100000000000000D+01 0.200000000000000D+01 0 1 2 0 -1 0 0 1 1 2 132 1 0.165770000000000D+06 0.001581000000000D+07 0. -0.100000000000000D+01 0.360000000000000D+02 -1 -1 -1 0 1 0 0 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 -1 -1 -1 -1 0 1 -1 -1 0 1 8 16 18 20 22 25 27 30 30 30 29 29 32 36 36 36 33 31 29 28 26 25 23 21 19 17 15 13 11 9 8 7 6 6 5 4 3 3 3 4 3 3 1 0 0 1 0 0 -1 -1 -1 -1 0 0 -1 -1 -1 -1 0 1 -1 -1 -1 -1 1 3 1 0 0 0 0 1 0 0 -1 -1 0 0 0 0 -1 -1 0 0 0 0 -1 -1 0 0 1 2 0 -1 0 0 1 1 3 256 1 0.165800000000000D+06 0.001209000000000D+07 0. -0.100000000000000D+01 0.350000000000000D+02 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 10 11 13 11 10 16 22 24 26 22 19 19 19 17 15 8 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 2 1 0 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 -1 -1 -1 -1 1 3 1 0 2 5 12 19 21 23 25 27 29 32 31 30 29 28 31 35 35 35 32 29 26 23 21 19 18 17 16 15 13 11 9 8 7 6 5 4 3 3 2 2 3 4 2 1 0 -1 0 1 0 0 -1 -1 -1 -1 0 0 -1 -1 -1 -1 0 1 -1 -1 0 0 2 4 2 0 0 0 0 1 0 0 -1 -1 0 1 1 1 -1 -1 0 0 0 1 0 0 0 1 1 2 1 0 0 0 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 2 1 0 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 4 380 1 0.165830000000000D+06 0.000837000000000D+07 0. -0.100000000000000D+01 0.930000000000000D+02 93 92 92 91 91 90 89 88 87 85 84 82 80 79 78 78 79 79 80 79 78 77 77 76 76 73 70 67 65 63 62 60 58 55 53 53 54 52 50 45 41 43 46 49 52 55 58 54 50 43 37 31 26 21 17 13 10 11 12 15 18 24 30 29 29 27 26 29 33 33 34 32 31 35 39 41 43 42 42 44 47 50 54 56 59 60 62 62 63 60 57 53 49 43 37 26 16 9 2 4 7 6 5 2 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 2 3 4 4 4 11 19 21 23 18 13 14 15 14 14 7 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 2 1 0 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 -1 -1 0 0 3 7 6 6 8 11 16 22 24 26 27 29 31 33 31 30 28 26 29 32 32 32 29 27 25 23 21 19 17 15 14 13 11 10 8 7 6 5 4 3 3 3 2 2 3 4 2 1 0 -1 0 1 0 0 -1 -1 -1 -1 0 0 -1 -1 -1 -1 0 1 0 -1 0 0 2 4 2 1 0 0 1 2 1 1 0 0 1 2 1 1 -1 -1 0 0 1 2 1 0 1 2 2 3 1 0 0 0 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 2 1 0 -1 -1 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 -1 -1 0 0 3 7 6 6 8 11 16 22 24 26 27 29 31 33 31 30 28 26 29 32 32 32 29 27 25 23 21 19 17 15 14 13 11 10 8 7 6 5 4 gdalautotest-3.2.2/gdrivers/data/usgsdem/114p01_0100_deme_truncated.dem0000664000175000017500000002046214020414072024117 0ustar eveneven 114p01DEMe Base Mapping and Geomatic Services - B.C. Gov. - Victoria -13615 0.0000 59 0 0.00009 BC 1 1 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 2 4 -4.905000e+05 2.124000e+05 -4.905000e+05 2.133000e+05 -4.896000e+05 2.133000e+05 -4.896000e+05 2.124000e+05 -3.276700e+04 -3.276700e+04 0.0 07.500000e-017.500000e-011.000000e+00 1 1 1 4 1 1 1201 1 -4.905000000000000e+05 2.124000000000000e+05 0.000000000000000e+00 -3.276700000000000e+04 -3.276700000000000e+04-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 -32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767-32767 gdalautotest-3.2.2/gdrivers/data/usgsdem/022gdeme_truncated0000664000175000017500000002046014020414072022376 0ustar eveneven 22gDEMe CFS-SSM -67 0 0.0000 49 0 0.00008 NTDB 1 1 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 2 4 -2.412000e+05 1.764000e+05 -2.412000e+05 1.800000e+05 -2.376000e+05 1.800000e+05 -2.376000e+05 1.764000e+05 0.000000e+00 1.127000e+03 0.000000e+00 03.000000e+003.000000e+001.000000e+00 1 1 1 4 1 1 1201 1 -2.412000e+05 1.764000e+05 0.000000e+00 0.000000e+00 1.270000e+02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 6 8 9 10 10 9 9 8 8 8 9 10 10 11 12 13 14 15 16 18 19 20 21 22 24 25 27 28 30 31 33 35 36 37 38 38 38 38 37 37 38 40 41 43 44 45 46 47 47 47 47 46 44 41 37 32 26 25 28 37 47 56 61 65 68 69 70 70 71 73 75 77 79 81 82 83 85 85 86 87 88 89 91 92 93 93 93 95 98 103 109 115 119 122 123 124 121 115 104 91 80 74 71 71 72 72 73 73 74 74 74 79 83 88 95 102 110 116 121 123 124 124 126 127 127 125 120 111 106 113 121 124 124 124 124 124 124 gdalautotest-3.2.2/gdrivers/data/sigdem/0000775000175000017500000000000014020414072016674 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sigdem/nonsquare_nad27_utm11.vrt0000664000175000017500000000204614020414072023470 0ustar eveneven PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -5.0000000000000000e+01 Gray ../small.raw 0 1 31 LSB gdalautotest-3.2.2/gdrivers/data/til/0000775000175000017500000000000014020414370016215 5ustar evenevengdalautotest-3.2.2/gdrivers/data/til/testtil2.til0000664000175000017500000000057414020414072020506 0ustar evenevennumTiles = 1 TILE_1.filename = "byte.tif" TILE_1.ULColOffset = 0 TILE_1.ULRowOffset = 0 TILE_1.LRColOffset = 20 TILE_1.LRRowOffset = 20 END; gdalautotest-3.2.2/gdrivers/data/til/testtil.til0000664000175000017500000000057414020414072020424 0ustar evenevennumTiles = 1 TILE_1.filename = "byte.tif" TILE_1.ULColOffset = 0 TILE_1.ULRowOffset = 0 TILE_1.LRColOffset = 20 TILE_1.LRRowOffset = 20 END; gdalautotest-3.2.2/gdrivers/data/til/byte.tif0000664000175000017500000000134014020414072017661 0ustar evenevenII*k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skŭc{sc{{s{s{{kssksc{cck{ss{s{{csc{sskccs{kksks{{k{{c{kcs{{k{{{k{{{k{{ssZkkkkkc{sc{{k{ckksskckk{ccsccs{c{kZkskZc{sss{{sc{kkkscscckssZ{ssZcsZcckcck{cs{Jsc{c΄k{{k{k{skkkkksckS R jN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.2.2/gdrivers/data/til/testtil2.xml0000664000175000017500000000112114020414370020504 0ustar eveneven 20 20 16 WV03 2015-01-01T00:00:00.000000Z 2.700000000000000e-02 byte.TIF 0 0 20 20 gdalautotest-3.2.2/gdrivers/data/til/testtil.imd0000664000175000017500000000030614020414072020376 0ustar evenevennumRows = 20 numColumns = 20 bitsPerPixel = 8 BEGIN_GROUP = IMAGE_1 satId = "WV03"; firstLineTime = 2015-01-01T00:00:00.000000Z; cloudCover = 0.027; END_GROUP = IMAGE_1 END; gdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/0000775000175000017500000000000014020414072017344 5ustar evenevengdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/measurement/0000775000175000017500000000000014020414072021671 5ustar eveneven././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/measurement/s1a-wv2-slc-vv-20160510t101618-20160510t101621-011195-010ea1-002.tiffgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/measurement/s1a-wv2-slc-vv-20160510t101618-20160510t100000664000175000017500000000026414020414072027210 0ustar evenevenII* S65535././@LongLink0000644000000000000000000000020000000000000011573 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/measurement/s1a-wv1-slc-vv-20160510t101603-20160510t101606-011195-010ea1-001.tiffgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/measurement/s1a-wv1-slc-vv-20160510t101603-20160510t100000664000175000017500000000026414020414072027201 0ustar evenevenII* S65535gdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/manifest.safe0000664000175000017500000031743414020414072022026 0ustar eveneven 0000-000A SENTINEL-1 A Synthetic Aperture Radar WV WV1 WV2 11195 11195 98 98 78 1 DESCENDING 2016-05-10T09:38:08.925424 5 69281 VV S SAR Standard L1 Product Individual SLC Fast-24h false 2016-05-10T10:16:03.843410 2016-05-10T10:21:43.669704 2.274918e+06 2.614744e+06 41.555267,-59.853012 41.592915,-60.097576 41.771866,-60.047993 41.734177,-59.802685 40.995907,-62.257183 41.028324,-62.496593 41.202049,-62.455299 41.169636,-62.215229 39.794815,-60.325539 39.832268,-60.563915 40.011257,-60.515934 39.973770,-60.276875 39.234734,-62.673012 39.267204,-62.906174 39.441105,-62.865829 39.408642,-62.632061 38.034592,-60.789581 38.071823,-61.021915 38.251064,-60.975319 38.213806,-60.742355 37.473351,-63.079170 37.505901,-63.306606 37.679905,-63.267105 37.647358,-63.039120 36.272514,-61.240555 36.309566,-61.467339 36.488937,-61.422005 36.451862,-61.194641 35.710186,-63.474255 35.742867,-63.696514 35.916855,-63.657776 35.884182,-63.435009 34.509499,-61.679676 34.546410,-61.901375 34.725979,-61.857147 34.689049,-61.634922 33.946625,-63.865074 33.979446,-64.082504 34.153744,-64.044365 34.120934,-63.826473 32.745842,-62.108185 32.782650,-62.325211 32.962337,-62.281986 32.925514,-62.064472 32.182949,-64.249413 32.215931,-64.462410 32.390312,-64.424843 32.357346,-64.211418 30.980173,-62.523052 31.016968,-62.736065 31.196838,-62.693710 31.160032,-62.480247 30.417788,-64.628410 30.450949,-64.837349 30.625519,-64.800240 30.592375,-64.590919 29.213812,-62.934528 29.250566,-63.143608 29.430504,-63.102055 29.393742,-62.892567 28.651915,-65.002663 28.685278,-65.207870 28.859776,-65.171219 28.826433,-64.965652 27.446474,-63.338589 27.483217,-63.544079 27.663252,-63.503235 27.626505,-63.297371 26.884308,-65.371147 26.917900,-65.573006 27.092543,-65.536697 27.058969,-65.334511 25.678265,-63.736275 25.715019,-63.938488 25.895180,-63.898258 25.858423,-63.695709 25.116619,-65.738235 25.150446,-65.936981 25.325153,-65.900970 25.291349,-65.701927 23.908691,-64.125557 23.945518,-64.324951 24.125763,-64.285271 24.088938,-64.085564 23.348600,-66.102417 23.382677,-66.298340 23.557516,-66.262550 23.523464,-66.066368 22.138948,-64.512848 22.175835,-64.709541 22.356192,-64.670334 22.319311,-64.473366 21.579842,-66.464409 21.614183,-66.657761 21.789114,-66.622162 21.754797,-66.428566 476393b5b42f9b6b42ccdda70871a6bf 1b612ceaeb5de8f2b601f8bb65dedce4 708bb76fd836390a9c5b78d561e5e119 04e9330451922f0fa2564f179fd149cb 9232dc8e714ceb4d2d6d529f2affa7d2 f6f03063c3491ae9769a2ebd507c2f75 b5e0d4146b9ed4d438dfaba50ea68221 d0c5c6c1116ad266e862ec193500549c dfec49789e25d6214009d96baea90a1b 86106aee140c8561b5e03db66febaf4d 152aba470c9fbf244b4208341b4e8211 87fb9fc49e5e0b40944970c38da4e48f f7572fe7c4b676e7120da6ebf0297f01 95ef8fc98aceeda9447f04458a2808bd a276d786004d7a67a5cec9cf1eb2d0de 1d2404172f6dc583b9e76a673db26330 61a1a1787c3ffe53fbebac6a5d994cbd a57a2a01c6ce6bf91dbaf413af0a273b da8cd75b7f367f2ff6252684c2c65f92 119d3d7f49b7f6320fd5106f0a96824c a8bc4240dfcf4bb6688bc19a29ed0831 a30df9e1ff013dbe5862db63641725e5 3521d22f24e5c1d2a5426bf9e7044cb3 45ef2de94b7aaa68e8342b63bc36d0f1 cc2130592bde9c2c9140198a94f3f0f3 cd2859a1b514f9df1506f3bfb4dd293b 9570ff94441cfb059f35144e7db675b2 f190ea70d397db2408a8f4f74747bea7 658d6573fc86e1bb2a39c2cdf907f8dd d4d728a5b618b5bcfa257086e286be79 a94b05816095d97cbed210279c7b678d 9470bb2cac371be29ea209323716f398 54efdc6e804422859b361fa0b40ce9b9 c44d04f1b643b2e22b86cfd594009287 41d2b5424d2cc66605aca5c78496e2aa 3db96f8008024310da4e384c825a61fa 185bd69467f9bbe4bb7fa47e3ba825b4 90a6ca3048d27bed795985e245d5a711 63e7d2ee114f62c6c342c807e8301289 c9b7b0a70a9e54f62fedd03816ddc70f 681e9f6fb6d66c90cb9baccab593f593 096acada43090b666955759eede67e01 9c7b065621e025b1da69090e9ac1192a 935218be1c05cf982fb4a410f7516f57 dd3a2c2782f2060ad1dc694931260a21 1c82fcf40b55338e3114007696b5e412 3c4265ad14451e8b3333a534582c7e22 6cbf5fd24068043878fc6a2b60d7ed14 90141bafeaebdd57712f636a845df188 9b1f34b8c3f5ca01f81877676332c079 3314b2973529617040516b70348c0098 0748e0997252ecc8aa6ed8ecb15fdfed e24e58b8b80db7df50990548be5658f1 ac945e1d60cf122093ebdc058b2de7ab c98d4c325b5de4c355fa98e002904890 c5942fd907433e571ac1e1fd23bdc807 4d3abee4fa61ec1e2b08c6c1fa451c6a 5c259e668d6325c8e70e44463afaa472 d33ba32f04f92e10364d120eed5d4681 157d58cb9b2ed5465d80078ba82a85a4 f4839bd1028f62ef4dd191b88afc89a5 3676f30695bad73af822776c7c2731b0 4e6ea965ff44b42f85be2a69827b472a eb6bc59216a98914b7d5eb316de9c157 1512d367b680caf3669e92901b184daa 3375eaa69c20d4b7cfb83023b8e3e539 231a3bc83f20af863b6f23568a1a17dd b41d3bb83b93a0aefc6fb23bdfd71ee0 15a449b5d856142a14303b57d6c136f7 64289999e9b7192dd42929b45ba86e79 ba3d388773cbb4b972e3f03b4e27a848 e35e710732a4a3bd335af2e43c9da5a9 258f3318cc80ca11af963c2c3b7b6eac df547764dd2bf74f7722de09a72e32cd 2315b38ae94a0946c65e732128e544af f849f78f1bdb6de3b7e3ae63dfda4ecf 23597047f4bdfc64d415826032b56927 14522a825629c868a471360ed720f836 d747f759ea8f04796c8745d617d8d233 995d3469426b6e69240eb5d2d650749f 48db07d9cafbd708921d8a15b01d8630 3adcdfd5d1a63c1cc4dab44213ac76c1 c870b1eca63bdd6d6ebcd1be42950d1e 2a6f2527d1aecd3c6995a3d78a7dc0dd 921869bb3b0e8d8fb1fcb7fbc8003d2b 8a2f5274a6ad8f3af8606117d688b319 aeca0f36ccfc12279202df955e6422b1 b36ceeec47455d89dcdce1552498d89f c141458f27769b6760f84bf57a194601 91e08092a9c7ea1d2ac46b6bd3851502 2f895f94cfe8fa4bec1cbe63634e8390 ebb72e21a02b09355b078d0276f9b7f8 7e4f6cdf2d60c9f794f582309684b690 7f4988a873b0197a22b579785b555bcc 393a09e4c59d327233a2d7c61dd1108b 712df3b42ec87ad4d9d70d19d0abd7b0 2a691e32df57a5897949ae3bf35e5d6a a6fe4441866aeda9e7d52e69368e14ac gdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/annotation/0000775000175000017500000000000014020414370021517 5ustar eveneven././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/annotation/s1a-wv1-slc-vv-20160510t101603-20160510t101606-011195-010ea1-001.xmlgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/annotation/s1a-wv1-slc-vv-20160510t101603-20160510t1010000664000175000017500000000475414020414370027120 0ustar eveneven S1A SLC VV WV WV1 2016-05-10T10:16:03.843410 2016-05-10T10:16:06.826137 11195 69281 001 2016-05-10T10:16:03.843410 2016-05-10T10:16:06.826137 2016-05-10T09:38:08.925424 2016-05-10T10:16:03.843410 Individual 0 5.046045966132076e-03 Complex 16 bit Signed Integer 1.497576e+00 4.124774e+00 6.059988896297211e-04 1.650168040094962e+03 5681 4923 3.234900000000000e-01 2.408609509578423e+01 3.626027e-01 -5.332760e-02 4.774104e+02 4.771895e+02 2016-05-10T10:16:03.843397 5.046045966132076e-03 0 0 4.173435353976264e+01 -5.980263505017974e+01 0.000000000000000e+00 2.325540810313387e+01 2.083444323039390e+01 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/annotation/s1a-wv2-slc-vv-20160510t101618-20160510t101621-011195-010ea1-002.xmlgdalautotest-3.2.2/gdrivers/data/SAFE_FAKE_WV/annotation/s1a-wv2-slc-vv-20160510t101618-20160510t1010000664000175000017500000000575514020414370027131 0ustar eveneven S1A SLC VV WV WV2 2016-05-10T10:16:18.532516 2016-05-10T10:16:21.424949 11195 69281 002 2016-05-10T10:16:18.532516 2016-05-10T10:16:21.424949 2016-05-10T09:38:08.925424 2016-05-10T10:16:18.532516 Individual 0 5.666623024116185e-03 Complex 16 bit Signed Integer 2.745555e+00 4.107765e+00 6.059988896297211e-04 1.650168040094962e+03 4500 4774 3.655930000000000e-01 3.711177315261106e+01 -1.147264e-01 -2.517945e-01 1.159687e+02 1.159497e+02 2016-05-10T10:16:18.532496 5.666623024116185e-03 0 0 4.116983157947665e+01 -6.221518227799406e+01 0.000000000000000e+00 3.646227634785103e+01 3.236794247105636e+01 2016-05-10T10:16:18.532501 5.674865392444088e-03 0 450 4.117314024547147e+01 -6.223950727533213e+01 0.000000000000000e+00 3.659322755864712e+01 3.248023492910899e+01 gdalautotest-3.2.2/gdrivers/data/blx/0000775000175000017500000000000014020414072016211 5ustar evenevengdalautotest-3.2.2/gdrivers/data/blx/s4103.blx0000664000175000017500000022516414020414072017504 0ustar evenevenfKO4@ I1NK?1NK?4~,'G#3b h00'f@w.S-e.-$w-81O90.*6/G0 Q24 1*Ġ-bTP{;ؔR~rJ .fĠ傾obPQIyAE'4$(d]s6%,/bPQI.II ƕS%ƈLO ;ۡE(3Ip`m0o#"(P2i"A@2(`!\!pd!4  `\.(޶Bh qq@x !(`` B(2q@0FPq@Ld\PD4t4! .h\\k.220.hM24.!4 F@0 =%0(kcɠN@ AqqCCt.0h (C! hCI(\( e6 b 7yi`P&CHd"M6!\eBt B 9] 2. siBa7Dy.(p.( C:(u@im:xC'w=.E΂ @s16i F5wh /#(mMA\Q0.'\\!N &'p#6CKzp\dE:; :6\"[!.$ K NуiwsBt N\4\!6$P0zDxdCtm &PFFRCE <R2ttM@iѠc(q.0B&Ѻ:6QАM:x"M8ȸBtsiAsH p @!ۣNn46J=.(E{L t0ۡqCt.(k4 \P@\Pi(5IhOXP{\P InMиt2. esm| =&O'sM 'kD2y0lОm &COhO!6 6o&mHP("00oKiѦ Mw&ޖ[0('q&yi04m@ B\!'],*hChL"Ij`NpitwC@ЋPLMP4: @t@ !r#hh(NR(!! tRLt.e 0.4C(НR(i !pc(x;Ɠi6 A ـ FOBpP b(n!0m !q 2E4!.A"AA"(B.n(Bwwd 4 8 ( B(dC@tbd`` .h @ .QPB @\E(`kB(\ .&&R.zB .o wp  \(i2.( !AMe" .(P.4(N(PP0.0.2`;b8DoE NsE0..PPEL &FBAPiPСqp:F X"4B (!:(X"iq@(Z4 zM "7KqAM% Ʊ8M ".4: !I ` B !A0"AvM&oG9p#@g+E d"@;pi( hPhICN 0C|CB#dP>254CH m7`ˊ3`k:e. f!BYCCi{tEwx` lE'CY`2d\is@`PP..\nAuM@s.0(Є0oY OYsF'AhF`vP@P@@#` cI @ (X66MۗFmmyV{@m %AG MиE7 d'B#KM p2(PzMa@Px="(!;{GpM4opinN0@E6i \FN瀃X w7Gitc27EL0lO|o[yGshM&MRn `.t ; 6w6' \=pO'stn(PM:l(ـ 7CKhBnw (#!MANPɶ2n % # i  h4fƐEx %dӸzM\dЀ  44 zA6۹۠n P ` |h F`  Enmptt0@(B 7&`!4ޗ2 )9X ΍ѶN L;f(mnE RE".(Pӣi0G۠2E toHPt244 PMN7^X C9Ǥ  ]izm(f oYF`\E< \& myBoX.7`F@ -(Ӡv]2(\И\; w<q5-Fh4&;P ( فBni(\ N#t(P 5tzC.m4w6(sGC'Ǭhq w434i2zF!=m\ @@'FFp('F@qC"@2ˊmt0ڈ..p!4AqA;nR!!i@@@m4J!L@QB (@P.fɴ q4(PD""!0!B&\&\!.x4PR( H0p й΀!k i(\6ˈ(EѦPBbk hhPsDH16&cD l( ѓM;(&j P`(GPHPp k@AH(-]P )P FB)LsGFP&0AFF`ƒNX !p! !Q@&  ;:;iÇD X&"@'F! Km4M !B!5 ѡ 6!"0N"za6DP@ B`e*A2D NBQHD&(s2Gq@wDB:2!5.! P(Qp 1J!`'B;.&Pnр sN@qp (\5742(B'A:: Dd)B&! "4l 5 E@ E BM .h( &Ph.hp] 2B(y; sL2b: B 20\B.i\ƛ .B)BsP4&2FAE.ct(dw0` H)(#("F cFABBM0QGFC": D!ڈ0tFk$tp @B0.%4""M LК&F΁ ӂ A\p!!1A@L{]46`6MiU&#`@4@* wP5ae Bw40{K"mvnHfG `Pg(\ @&DC!ᦃB`Њe @AM4aP4\ЈCȠRP Qht\0(bnB02@@ ;"h'@"(@ˌЄM;&A&& Fs&`itw=P90Gim"`Fte; 09Dl@}mt 0e(d6 \G4:0bd7GhAF4(n64cMq6("( B@A. O&  X!6 ѶDr&\qZn4;,0n[Q(6 MPs-"-@ 2h&M4ӣU̶ 1.0 mӣL MiFh@4ޖQ(M" @")r\`&y%7Cd".6浫P  րzǾ7"D(NCM:;<:("P`(B )8A BCM*a6&BH!(R Xp@\hE"p12\d" ;7ʨ )Fsp D2a@"B\bB) 0$ 3*"!;E=%Ժ19pQP hm#PD\"naM: !"D $hB.H( j0(54jYsMEpP ::6&@,DBa 4E΁6Pt4  ag@o&PM X!˘!x0\&!\ PFpͻ "6kHFFACeJ.ՔuZmDB\5YR]dBhCw8"+8w6( We1 ِnCHDA(l . B hM(C"! BM Q @PMUXPXeāEPآ bfBup APiM0(pQHAFT6!3'FP M;3w]0;@dsNw+@pO04 P@w.I F`y7F .mF x7A=C!X6Et(pF@7\'M_3mKO9D\s:;tm)n:l2[ >WFK~!x3| #79Fѭ\Hpy&.gq Lb0 7\P;@PP(QﶆCH"( 궍(4sq}拃t|CBhGqLx0 `7絧C9E8'0lx wC \<. =&COy0oYshDm=/tco  &`O~np;p4\PLOkh4aFdƄ! A d .lQAnkh"&4 k(q @H Q`tbmA L(( ApGxNGpiͮF dHy4&n&'GuD:!a \Ў6ABM3@!1.( cP)|B( A" <!2\Q(0Be  ( A@"`#Bb@@L0ismdOiA1Bh9Z. HC.hn AMmDP( !6\#H\&e!::p>HdZ Ce͠N+P!(hȠP\(P.b@ɂ4 B F @8@F nt2 D 1pm 2]MhAmA2 @U dR.tty4PNe=B9nAB;YA| 6ӣB)tLFOh 8Mh6 X"<` 昁1 iAn`Є2j05 cAA@M>0 !5y3hi`22hl`(C`0y'HBm `h@nPi6FȣB( I" 8K&sE .b2 PA iK!3CFd# l;@1DPPEP@0Hȇ! Q7Y7 ҏ(3X"uKP5s;- & D"0x0 \< iD04@ꈡ&)("!4(P(:eL.FFA@E'k9MEm2Ff@d &\)\QEQt6@ $Mo&B0B"nmw0@`\`P 2An่ 1zPp҃@N@AJ d] NKPP(CICi26@2g86ˎfpndP A 0(PB.QH\P(&m6  pq bw&".E m5GHp# E 7NhB5xA/IP#I@h@m`CTDCm;.z` !]mChn.bm'w ipFo0<0FPMM:6^$MB /t i'K>GXM<\&[ "m(%OtmKG32|sMOGf6\FR6D!e68].7|!tLAsD4 x= 7HbhqBtB"t @!(' kw p"(LD(i*th29т(#\  "€7 "q@B!⌡h\„Bh!YN7:\]0hAB(&PFi Km. -bMlM)ht7lqBLRfP@B<*2684(N!F6w $iP FD4=d"!(`P(`ȡ\\i@" ottIOK@P46QMBq ^ 1QD "Y44niPA s%5|;!Pѳ'BtC5FRp(AB!0&Պ\&I0+MVjaB Ht6Nn]Ї 'G֋0bmd  Xi CHHJ*  H(d*/,4O,,Ġfx((~oؔRwbPQI͉AE%KlJ ).U`0t0hMtq2t{@KP 'pF MQ񽮇+t2`!< &n.0>C[!t(/ipNѡJHM3u ;'w <MBo L;@-hD#[\ o# o!ppNm 0 Gs@.w:\Ύ x`B2tm>PM AqBF(@7xtj`\ M4Qt(\s@ kz56؝ 4mi0 LT ɍRh6x7FЄm@mm\='!0sgF!w%` PC#Yq@''l(B 6븸PhEH 4'N!#t}QSNo`fe7 \\\FF7oH ix4=4ty:0M: &oXkm6.(\Р tef@n^.nw64mL & P(D"+Xawd@ (Cw 0.t!Cm#kBKF ]C((7L@!0\m"ˈL. 2PfIp x=oHs(@z!A&k@MF퉛A0PiBLCf\ ! HX)d0 \&8F H Ml(Q 6&4'\T\(4Qh2  ."xEbd Eࠊ2qA{XBw]M4Ds-<%4)ȀF2!&LMHHB(р6ŒF4ӠPPa7s 2`ؚ"@m  Xs@.B( L&Ld@h!  dMM B0!67!C7I 4 (!LNq HE @teBEFb2pQB@d8`PP@Bt @M:87p!LB1;"n4ir4DJ&asF@#&(!e 4CLBBdB6P0fbmK 0NxB(V!\sidAC!!\10. 9B̊FЂ6<HPf\ Hp544t()B @@1 e hMB00(; 6"mBA )-6 " D( @B  )e.46 `0@&PcP!4k"(P) ! d(& P(Ω AF 1MV""P".{E" ShP&iKE{G@ H2с@AFP (B(4 (2\؝FmmPt! Z 4iѦB.EMhP]L.@!43HhQ@8(  M6a@e-ELiA A hh@@ M;bwF@ڄƆM\QPF@zwG Ph rR&; (И ;0I{Pz ]M0 "X`(@@ P k."m h@dm \5 "`B L(E  \ n0 QC ohB(@@3'F B:1CHh@ (:] PAswD@#\e.4@B"C.{X8d>a'M>`mnei Ùmn44 " sti e&htN4Ӗ!VzEM5n<i`:7DސFx4@ 0E.(nAo22Qb'yim(# E 70mMn9nnZ..(d`@ ` 7e 6m0 :hm\  OA6 4O'F(Qh#w \ Ͷ4ptm\#`\ "P NpQ'mm4e0yiFGA˛a]M<=&YF f 4ǀP w .hAB7-0mh Fsr;(fh@M 5xM4ɺL m(!&2P.0eKMkl<p4#[O@ACHqAK ·9FڗF(`L\hCG ЄуdG;ttf 94"ӡCN`\&PeÖ.iй (P=EPw:6-7pd=`'pQ0Qeͱ6Cnmd tD bnd؂Feaq(NeO'qQ< 6J4`P  l2w6e` 5;AAGFn:P4'%E'=׾ix;ltGq ѠhE{im6A hOYڗ6AVL"⎎Ip nxnCp Z"+Z(2"#H JЌpH $Q킇Ch 4  PPApiEM E\(@ @RJhp6 M `xH !( "M!И 1E &:'hMD1J (2!ї@\!F`\4&!8К!7AP BnDhM0R(B.im0FP'QRm̛FªtR-h@` 4&Դ&(8QhLї@2C@B6Bm1DbmB"4AF#[l.i@CBP @4` b"hQ@CQ.m4)N0BRȊsMlN.i•R 8(bt(E. E l0n(.BЄPtQDQ*Ġ-((}֌ؔR\y[bPQ~n1((Tdi_ؔR\sbPQIrN$+0ZJ((TXRTqAETIc3%.V0Y/G(`Mi|%(`F@"dPPE CH F.fB dm(P˄!.esFC @"A ("YC n((B`2!C qA(<qp.0(E(P24 dEd 2 i.`@.3B4AB(@p"@i(:FdEftm0k.pB(B\P y1!i!. €( @ E @!6BCY!؄0 Ct l Q h( 'p\" EP07K1 !hi(PqpPE.(".#4@2mBeXP=%Ƹ\ PuC0(P 2( ..yA("pXEqpp D B !s E !JáPB(PE]   PE0 A@0(P@ 0#ᠠq& PB PC(|b(PFEB;(i@`4qqx 0x(o00(\ С@yZ7@6f E#B.h@@FN1#AqC \P&0PE :=b. P. 2Ep!6!` 2`4 o;"  k (( C  ѠB`2(0hƳx("J  ̀!2@&\&nQ.!6e .  4ٺ! ".(A!`(!@(o"f[mnࠆ;3nPM('D ]O(:PF 4B!6`dm˸o& t(\ h\4\ Bm. 6y6@0zJ7A6 C w\:6 ͹ѾQ..yyDKFСB6;7 4E aAͥN\oiA4EMfe $mР#  67ɧ76\ 4BHͼtm:m: A#t!6h=FО|ӡ@EL." 6فpm; QF[My7FAB(3Hm҅B琄Aב@7X њL Zo'Gy4\#Xq@m<zJ6 th:=\! \\'-4G`-sFt@Ld6#pd dP אtsFFCY0z]=`*ĠʼnAE%z1bPQIrf,J ).^51((T`&sbPQIrt1((TҾAĠ%%Ҭk\@*,'x͉Ar؜@*Qd }^fk_|n2RQT`i_zAЌ1AF AqA ".(BF (#k!"0.02i qzA &b(1(`n "`B0fB( Qtb q KM4P@H&H0.(@.4@K`Eiq" 1mwApB(\PB(\BX\ .tAiCBht0P@! F!E hB#(PqBBiƌ"pR( E0t0t`0 `@@@ B KBhE  С2P@# m4k(@ ! F sAp&@#hQ "C(d(Dk PE !2(020 p!E ` 1 4BE 6A%B M0fPqF &PLN(d\`PCB`'q@\k( 0 0y `"( A 0Hdm0GAB  ."e: 22EIp&BPɢBpB f@P..C#k`P(1Ah. 1p`Ah.fAPeF!qQapPB(2HEΆFBe̠10`("(\d@F(`!^A@'p!4`5q\! .5 aA@PM # @!6FEPB4 0B".iq@ tB@` CPA@P!P(PAFc 4(ˊ<C(dуw2pYp`(@ACJ7pDV@2:@L `` m hB4Pm6m4޲.(О0h&>`IC۹9mx.n M0iFd!M x="F6B#<؄Km;  !qstiM7F`礸FO| 6D@QbfMFQѡ33tffXQޘsm Kff[i6 @m\Qӣi5^N\ҍFmL5oti F4"2ein1%mmZ2.PFQ2 wFB0tx:kw:.41sEͶ͔{ NH ..6݊4lF[PmipnS| oto. Im4Ќ =eЍoIFC|aCEk7O&p#"2xCu[0w@=%B(QQ B . o[d  s4# G@͢ubtti20 Apot8J4P@OI(#mPt(\s0 %`LdPi4   @'Gsi@Pm (/ i477!=aqqi Ћ('s DEkzBn y6]w6C{] A@ F#EM̰\x< wBs &M4=ҍ[ o |m{Xdn"祶7C" nZm;47tͦfe" Mw1Ek@tm.m7K 14\yFȹD 4Asw AsB.n:[My Оmd2l،hPMAF\ЀP(` wmњ˹nfl˥Q %0 @". BB⍍2p&)tȸlM2 L@IA6&4\PP) QMABHl(PnFˀN2lE"M6B!:@a\q`LlRdom2((@SA h0e (Q! 57G)\< LEH"QIL E)(mB( (8 @ aiЅE@ S"2؜ QH( Р4d`i2@" .P!7@M `CB(B拄P@=&A.tEm(416((R(tdNZ j &aB 6mт)jnlCd!  4'A2&!ЂhP!@CY[\IpkY$ª` jH.]r0V;5%xku\ڮLJ F Zb}Ͽ>Oԟ>/bPQIuhbPQIb3bPQIr41($XLKK,yĠSYbPIERc̼yi&QAr K3Jִ+j6鱉AE%K %cp@ĮW(,I}JW&TbiR`2Wՠ97TX,/.[@o!n⁁p(PF !Ē p @Z 2&dPM B(P&4>QFAB^  PA::L"dA ! E΀fBhF.h\Q` #\`f(P@ȣAAh Aqpp(! .&E \PBk0(1C@ `!yB. 2!hxe  \Ai @ (h5XPdk˛tnmȀ.0 A4มAC K pE͢ E AM  (zL K..zYC"BA @ ɽ$@p(PB2O !P@ . .0LM4. 4Ƞ&!!B(!YCX `  h`FAd\`E(.\\&(P"=n i(P (p\2 PMt.0\ 0BAq\d.x(P@lE (2&64 (\X!25h(&h Ͱ("0E 'A N@qGse&P\i064(#!!:w "X2. Ce!" B޶(P(PS.g AaP@P@e;"npn0A@.( !w0(PAp&( P" `P(0 PB\\Ӡ\\\\  x4y"H(i(!2! QzC! "PDV" !Cn[m4s3 twN@mZy)t(Ѝo\mẹ\Ѷ  aGF(=/K{!Ah.mx(E="@iJp@7] !A7 M=&F2D8t NMсGHP\Fk۠( ؊7G@pwwE 65M;"tywilA0 Ȗ\P hM0\\\POkCɶإw="( E w i{w=-7Gg\4`LM.io|F@s7FG Bk0 " mhlh8sN80x;2 @T(P";{`on'plF'@00 )iAmL'jNstw64k0.Mw< -Q%FA0hhhE%m1(0w=-/!b5h\ MN0D&n瀆B64PhӸLM=!s( 0 x< Єy4\(M KEɡ:3El\x4dBx::F&˂w6 4Q4A7B-l`ic@@s-Ll;j"Ex(ЊG;m-1'2(6sqANF q. R->6&<,(ِCMr|-d!LQm4렌\t0t4ky4Lt2lM=G5ۣhOA4hFGFHPɔLw\Gpiz@iA:4e:6PѢ6M- .z (\@" -@PMhB('GpE&C ѱE.2n]M6Ӗqx @VDTDP" M16 2 ZQn QGH@`d t !@MBa@!H BSL@"F&LC`\ѓ bb0jpA̦D4 (NLM&RP!t  &`M (\!" h.((Q@ 7Aq\&bDCQ"& C*AZ P"'HM!IBm 4 @ 4&Pb b P @b.eƁ0 !m 6"n B 8 (!h!5( &@0P0 Ȅ! bn U@P#:( S.!x1"ۄ As!52(!ͷ()-74c7B@R 664f)A ѷHi CrV bi614’B!im@(‛.6(0 "( 2`(`F`RP @ m@B \bm`2MP(;4Ӵ"hQ\QVh@`!  P hD ((!E48".sM0Qqi!q@nDEe m.eEB␠E'MӸDP(wtAB*n ;" C-"B.h6E` M7Am@ HsLN1C@!H"K: `2₌L60PNhNApLP2R  DM4!5 M \#I@2 4)`2"FhNokd & oLth- (.&4i 6Apx .w ("2d .eZ(@"m&Q&!"#j( AAAR d2Ѧ% ‘ &E./&w4@FP18i_@‚&6&*2FQ(`! \"&&AF 6O6(P@;Mm.!6&ؚt &QHB\6 9P'Gp \ M4" \PE)ah K6F]-8.w1.(& 1K0bthL\D4a (cAV@DI`.nVЙ2n;CMU'AXPh&" .&B ʲx.'F0 " 0ɢ* Ɏ@ #) СH ؊(Poh((@17sB0tf M &F! QAM:lAPP44d…PB2e$mPV tAwp4UMPRPk&t2a!@TLPN5,(P7BhŅĚ%I17 @i%oas&F&SQVs0lM^ZiQ8ca7 Cp L&@P<!Vi@ٙfə̘:Ԕ&ɑDE*+2m AE ÙJjUEe͢h,XPȚP* 6&n,"4thAю!9ˀBhe##.l2Uj!EyțN舊!*_x;x(ɆtmAG[Ԏrn"OK`Qw Ό@<ɗ34LУFӄpd &\VD6r6Cjl$UƷqHߍo,qIth(!jХHP̣AB PtPRAq PB n:0p& a BBtAitj7"f,"l wK"e)hr0C(QH(pE[DPC[SF:;4„hC@N A{ECEG%41SFBHhBJ")ChL(5%I \!Ȋ6IsB.nZcpPN%@UtH_Qp8Ch H TP)®"Rrl*MG c(!mJr! tBpPqbbІ6 "rE*ڱw @ZX*dgFBXR]Pd)~*Uh 硢N R/"%2,w"ֵa:Yf&f0"6_yXxDAResv3ZňrsijCBuJ( "o;SBr֛6Ebq UtETWGCr-ZgUlCтhm4@-VDT!9RшMJm-tìL8%ChUQ74"80*f ְ| QP3R[:WÀʹHDhhѹ-RHU* f1ތ<ƦgB6LNmcJť^lB/L_WEk%`2AIy%& 1,EX/t\V7S$0A&e`_`~㟙>?$q̟?/bPQIj͉AE% ((lJ ).U7cqAE%ʦ KJSKOOJ+ %: 2 ,`XVZ훉2 )0U.Y, bRT%|$j^iX*-K2G'P88QdW-LG=e90Ap &F@qP6E "(\d QA(nJ(\!\PP! и%P@ i(!4 ( PB(#t.\## (( DhB0` t .(PHAq\ YpKJ. @@@P@6D\ "ุ @AFF&d(BE t.e32 `\sC!PA s0.'s dFB @k.(`0  0m . !&2t  L( \PB@h( B.i2"54"C& D.`(Qh2ACHM@|F .@aA0 b.B0z`tapPx(i "M(P.0@MBDP. .as0wD Eȸ!1 CN!A2As.@(`\kP\`Bb(ѬNBy 7b5( M!ޓ( 0`\\"4e dP(B M BpmQ1p @`PFp"!D"Ѧlx@!4:6 4B.(d EP@B.F ""JhO'B MЛp'P4&q9J0Pi7J6 @mdd `0lAppP C&F&ࠌ b8E : sEqpLP (A  02 !6ޖm۸OKnnm y# 5A Mp&x0"x`PM ApQ!6:<Fqsot;si3[t6Hi.qBBx5x&Nh&NnZmmFӸA0K`&P [i"rܦxjH@" s7[t(Q"P 9MAZ5`۸.y6Xtw;7sPne6F20.. hF ;MLAF.zt  E@\ 1 (!hqI``FFh7@='C'GqG Gq@4QCXk#H\`i %5`:zCmސ="l5]G@ȣFo"๶͠e/#N4bs& C"  M&ؚ(KA4'mM42.(|2w1h#Ip=m;|F`\G'pLo|("i6;PAGӠ7@7 EKB 'A@ @Q&mMOXwBd@&(́sm4m77@ 7BqslB 9h(A\ & nN ȠoV(&#nGE %sCht44 hi8]GOXPV r pibLDFD0CX4 i PhDBdQFt\4` A EwJp"0\"X2`Q0QVLM5A6Qd'D.t؝jE)(&& nPɴ&t!V@AP(  AHrAQA N !Bb &0hRM 6C 0E 8iwp(" M8j!HE 0(1( )`nc( \CjD( MBt!#F Ь  иѢi!2(р @LO"( 8EEAF&!:(0@@@20B4R `Q@b biN ;3H F PT͢(0"BtmmmT P!L@lQ 1DB(m4"bB0AC: K("F԰ E%ѦE!h&Q9m@F!6&؄\Js(&x2(# !@"\Fnht y4"A5Є Z)4PPM();m\2M2\Q*y2"@ @! Q E+ E0NAal(\BjQ pP\EtЄ8: Bw122(\A`8h<H&4 EafpE4"Q O;  P@&.0eQt]ؚaN рPЄ". *&mhLPU.wKP&  FL&)hM&PDF؁16&!B6ht4ŒCx Bj"BchPh ۡ *B'H@16(]@AFก6Q T\5 " (ZhM46(`(.iB 0E"p\D@&qsM e 7pCC PE C.F". M:<@(E$ɸA Chb). 7( Ee; 4F 4R2DEb "hD!.Hs'F2QP*6Ԕwi20c EуPi)q (!0\P pQd !10i t(Q;4"@bcFQq@ P(6S \!  Rd\!B!0y 5B( @@ @(A0Bˀ&R]h4 `ap&1.Pe !".(D@pA6t\e `PU t IFE"H0.hB(\VDTShxBhAp€Ъ!B")QX S2r f]s.T@s4HnB A tm:txD УMM.`B@IsFڙ(b cDBlnlx6l)-N eG3gGeԜlRQAq*_益DDD6fִ̦d\!7JR3ε i˗27BE56ȹ/.5b" `78:< ɣB(m!P1[s$hܣ"7/ .`0VEiXN(DV]8lNR)4j@e ֪"9[6i.'f/N(6􀴢U"QE ِ\::4jR!CiFDN \hDN\T&hD9d"e"pB+2[ɨAHI`8hl@J(M:@2U(18;(!: B :E֠a4"RG-UL Fe"epC`\Eh! R!6mQ pJe"hnNi!pQ<h&"(!5-)jB!JiM'H #!D5' m 4BjD&)C)(G$Q EC 'L:P U017B! PmY6QKi6 O&4ad:4ӁBm<@-5C.(L‰SsU\K U0h[PuhQ:8V(;"6`!I sHEKnU&ysЪuDN6juIZL1M.GF2ࠊ4a]kIF1g+Poȿg,2/vYhmq/L էZlA fS-0'IKTjn(12%1Ɉm*L%!lNqs;Cm"=MUMA&13R!:(Qy#Vk "Ac\ݍcg\f8ɽ~-2`Du0UԄiHb 01 dEؤ3PI 2ÍAx2X+5XM"LI+\}1gf}}~/bPQI W*(.\yĠĠS%OL& ͉AE%ʧ'SE%KaIQIrTyҵʷgĠSjdQ%rcb6,*̒ q pkN$*,-k2l"0aс A礡p`Ћ'pBp=0#|at\P(" "D @ 0(\Ѵ.cR"A@@. AJe;(@.w`P \ECPB("PB"&4OHP(AqQA@p"zࡐs @4k \ 6 M E(ӡF06PFFq FEth@:" (KȣEP( 20Ps@E2aPzE"t(&!!y1 Ap(\qA`;\p @lBhwрpe B(( :AHL`` E\B(k``P `P p@ApdP0qFpE(d#4sE! pp!4  Mz,J +0V5ՒڴLN,J )._J ).X+/:Ga&QA%K JXַV&Am\+bPQIRcҷ΂TU.PXҙ%fm_~w%JnªX^kX} e 剒ҬkZm:;mDQ6Bntm4‘Ft2 PB.0p! CHpLPfЄ F\PЀPpEF42 "5Ft E p0e p5hA LE!@@Bp"H B(Ѥ0o.cɅ FCp3K#Hm!.  pQ 2(ˋ(4  P\ .(kFm(2. iX A< Ph %!&@(b.#:A E  `4 0t P#F @!1 ;p  s@Hi(PF b(44 pPEB5h. @ h i@B0(!@0.(``\ɳAq``"o iaswpkaF#A퍢aAwB.4 ЀPF@Fq &P4 JO@mcpP!t\` (`\P` (4# E "(#\ ` :04&A@0QqtPE2 f. D! 4( FBd`ˍ&и4#1d&!7 `3 w P4ePe`POYQС (Ӡb4 "&\qqM@ FH0ȸi.(P"LBhN(!2t@E .4p@wids(dq.@C5!(s@ 0. 4A@Ƞmt2 ( .. E x0NApBE @ MPAb]/ ͭkkKymoK( r`(ܴM PF`QGqth.b(Bb:9;hm.(PИ&Fl Rٺ"m4'0t0  hBmf]M;IqL2kf0m C:;lO[6mE.! Pw6t58 QQۣȹs.y( @&nX@!dt 4"`QBr@&C(ɹw7BKN)h0Qs"nw[RA@ ,LBs.Rlmo..6Q xTBre (sO&y.mmk0 +mN!4e." (e -KFAӔ FQ.&ǐFd`P\˘M d c\Й@B2txF" imЊFr 8O[M7́FxFM:( 4F!4PN4@mͧdК(`" 7Aй#t8K`{FΆѤP #!7se idhɌ`MHQ =<`zM&GB⑤EOAGnfF!GFQX(# ѻmp4mhN6(jeEtmM @# Nt mA7J@`siͦStO&x aѕ (\#hBl(E(`\Krti4&RA0ڛJtr=w6B@sisC6IA< AHB筹ts2\НΌNi NZ=% mbe .dQ"+ZRQM 54fj[A2 M ;@@ 9 ̴B4Am@D Zi4Eb#&n:;M%d4d#X EB!0)/p(Œ8$1!\F(`Ђ L ȹ6Ztd't(B $V :A !67t @E ڂ( \m \"q3HN@:)m";MBbt&AC" mm"1HM@ 2mQA Pp"@hB@(.FD(B8\&4\\P Be 0x@P@t4DT2."(h ! wPAs4#ba(ӠPP:;4w@h+Fh  4  t.!1:BN4@E @Q&:(&6΂ `\B"P B`'qE)f&@`AFBѓNBZid!"p&8N @tpiBdAA@ 4:6!6Ip(l0( mpP( JxJtBm@ Ƞ\Ap"Kq\ 3ЊNAq@&\( @E 6\\FHaP 0tw(4E(Jd 0M0 "BhBaӣQ  Ӻ. 2( w1кh$@&@S@+@(P4'b(!1K@ PLDFEF„ dP.tj!F "(`HQ 'sPA &TBb`(dP`hp!:@ 8..)$PDb@ ͢hNࠛh: 2 4@ AXBAF(M@nG7@ weѦ@(Kʍ @M6n.Q.""@E "F BwmD'p I!!:3GspMD!A (:44D  ˙A( p& PMm:@CB@EAeZC(J6 HA!1HІiB 06et` P6K(p&Bph0"0("BA&& P0ӡscw1d JE4ЙFhB!4 hR7F1C.lMΐ:\#mJ )a6)A@@H5TP4 Kt )tD DQ@8LA  6lMD mJy@ @|U 6FC6i\˘L@PBh@: 1s24d: VA@p\6!E0 ` t W` 6cw (*P 1F(F'B0qA@ A (s@ilr0.t((" FdPB! E fAB Cd DT QѫV3Wc& kš Vg aB0kWGBהtR 6tN瓙"P@ ^NNSMnCw9Rk&JW@ډA@ih_.\'*E*m -F (',-V†P&Q@B -i4НkV\@ x PD@27E Z)a(iJ5-nt#r(塎@(.qB(\(m%Oe] 4 (2Z_XƦpR۴:LD_k@A( %6W`fTEk5s-ê&E-3 mU"Vw9Q RHۥkUB(F5u 7̄tnnhPB :c.NrcjSPCL:@DPBw%CӆAF(\a EA1@+6&+JÊ#6 (u) P4"nbu#q@N0,Q !Ѻ+0jbtUM Ba!H\4 nN 1Ct8tjUD ! 2 h.]lQqm0aGvw ˆVSW[Pd BmD<tbE;]daͦeX!5)PӖ`&V a@t SL'AA40(bSȂ 6:h BҮcRdDQЇG[gR bj el@ "nQ 2%"` k,w@EsCF5J6MMBB+Zʍ@5sVn-GvIv]!3IumW1F5L-IDD[Dh@P-jA U%Z•.6V/mjVz9(o(D+1G΅:7:@Id L*0+) *#MИ,)i( E*eTJ"aիV&j8ښCo1õj*Eo8|;!jf؝h]hcW_bѳr\W&#bo1jyU[F=Poxvש)]Զ,ncF2MFWf$jxԂAiW.5y^j.Y)/0[Y.eyEʃQRny>3폿?*}?~y/bPIElĨIX((GlJ ).U>y\`V4MkӡAE%ʦ bPQIr^dTڵ+3veH/,TdZpdq1((`X^h5Z (eL}qFfmXzwpI\mZS39Vna]%A*XQ\y& jfk_zFN96|N PCh6!B@4P("\B E!#⁤# \\PyE pB `P.(h@C E ! pBhAtQ:=fAE "'F!04C}F0 " t4˂0sPfFs ps@#HB)E 3IBP@ " \! \`i'@. p`b`&\4GB s.*PBt \;2 '@AA 4Є.!FQ #hD Q Aw4 "(`&\m L@.Ћȣ4 e pȣFP4@LE  &#H::(@ (@@ =!p#M'ppP``A<.7` 3"0 lB..  0@4(A;E@ \.\"@@P MH \# 0Fd0& A"E(P@ 4"@1PȤ 6;ɂ !4<. b.(5(4P6Є'p(e08iѡ4dd:ˊ:@NBNLF M:@&AEɠ L M ;8LBLbaF L@m4^ a!<PBt  (&`#Bb.&pp\򋌄 .(44PAGA b#ѡF@(\M 2 @P \"!P\@(&H0(P! 0Ah# Gp@;"zB<yFPEA@E 4 2B00 2(:.` 0i!0+F"&PD2%7p 6iL\ͼECiphQ6NME@(ЄFӸM4k2t8twtw4M2<="`:m"Jd (nF w "\@Zx2KB@\`e4m(Ҁ|@P,on44 .``P6$t !BJ(ӣи#t2ht(  [eMbzZ; qQ::7\'P.tofFBaA< x;Qp[Meoip0eD>fӡm;MM:6Qxth&lPm'tA 8n'p̄8CBw a4\iMJH ! BwMA e(!:N+@BnЁDD) 2QFt&B!6:4 OH܅@i\&tth(6$! 7Ba5 .mH e͍&2'XPbE2L)շn"΀ !BhhBm&J!(@p! PtF6j@)Q)"((. .)  0p()J0&@..! jAAbli\4ۄDCNLP@A FMnEP&NHBQэPCF qm" Ddw 0Ch0tPBh]9C CC(PDQ j iPFFp&\(!Dn DAGAa@N( E"R"p`RP'@j()nƝ7$& 4M`#N&`؅ PP'-e*TMBt`!i8 A"H m@`B.Kd% (L lB5hQG,LBtmM\2(PD P" 4QMD@!\4&"PpD& B &B`"昛hP.Bhw$6QR`QhB. M@EhMr& 7P#"Qp'BC(`ap'@"NA IFpCAF0hAUP(ъS4P4" B ̊6EwhiH6\\PE M:@40MHL:Bh(Rmsb@  NNaF'A6mtwJhhM"h(!Ci@@ A2B^ !*!@ [edNҥ.lP!&Pua "(hPMPED0M \Ԩ. 4 DРFMIsD A1sDDE\46НPBQR,@'Т&!j 9!b%&E(jD!0m "'A4.Thh( N‚ BA@@)p!2Cd\L B e lE (%6s$Ft.Bh&BeDjZh]Q@EMIR Lo L."A(CF& b.LB.twEĂ4'556( C'AE 0wT".RTBpD4۸Px6UPX4Nِ"@QSG@ ! qBA(P #& }H @Pb;Z](܊ ad.nF HLEB@KMD3#JAtiM8Khp\)(Pt&A w47C( 0_̛hK]((*C.40NN pQB-a) m,Ĉ @U.n[Ap#Uq#@nfA 2AAp&Qi7 4'#`Bh@ Bm/&nVV15k}2Mk,^x Kmٴ:157fm%54)jA9p9,D: 8S#DFQ5$Ony &M60hD7GF3Bj-/l`n!CjSj"灢\D"Y n\&1yJh Jn!68c![h ˙!Dn7m49j FMjHL6vcbM fJR 1E@ CN(ݛ\hۊCxB`s 4:6aBPLpR%5.(6چpȤQ(TCmVX!hhkMb[A(D0ŭd:fB0,Ӭ[giQfς+l#=J$B"(D*)W n)W@BaGA!1D&9 77qDBh6%eZEh"4z) ؂BѨLm `ˀj  a@ &"Z@ڪ L !7@D]* @c@Ĩ( m4 D!&1R(JBQA@PMGA)R" A*Zp( P*8( rN聸&(@PJp 0`58D&6E7s `CLnFBbbb [C!l.v 64*Pۊ)7BF 0DD!JoDDUPhdZ(.kiq_;Q.5Ze"(11Wӛ_()1H5P% jj V Ѣ)!U5]XE*j1MUZ2JiQ6nae m(0V6V8[_MP`KQV"5(ٲTP |RL8lSZbUsL;Z-,MNj1u hv$U{Zwb9#Fկ*Ft[ejHQ,9j *g3 W" 11jbyT& eb1vS (Bn1|ëP e 5Vqg}/5#Dm7٢ 8[7%B5\WI͉WkUNI;[8a}mqpcw$ϓDWk:R7rsΊ[,F*+qr2-bޢoz&f@ .\FJb\ꦃZJTJƶZ-G .r`_z~CϽ?\S?=`/bPQIݚR\U?۳%/hbPQIr1((RTXiW]:R\`"wQ\U,^mZ LddX**16kJfpo5 RcJ^bkYY %rĨպҶ. j庙s+-հ$Xj8f&Ks:$ɐiY,K.#r @N[mQ-Bi"DAA4\C\ pn4 C@1P.b@1 02h Іl :\k(s Ai@1ZP 0P. B๎D (!B  Ad!04 ˂((`@wBe "t@0E@" 2e0:4:E 4LnE A4@ !"bhm@oB(qB`('s( !BJ4:FP"hB M.t|% 7B t b:E(qpi (( &F`BiQ(` Њ:k B( @!;\'N †0E @B EAP@A " mh(FEP# PE0Ei" tt("w!L OC@teE  #)sEF0ȸ!:< @##( . (apeb@(Q0h" ( E҆\@zA(P@!A Ci.C0dPhN(".6 0h6 ; n!(!(۠ 2f.@ x 4.(eABt ((& F铣M ‚iBl(0@PF\!e ii 0bhBB\.hB@P."(C! ;MP`pAHE P"@y04  ސs\".t.hAPhш('p"!PC%Cks@od(B Bbjnew0 s@N@Pt.0pLO:6@@@2(FAtMAF QL(  m; AIi tm!mfSNxtzD Ժ w4#hi(dܻdQd (k⍲M` 2 < CKb8`zZ.xCtmQ\ (.6rh\-&@.sFny:(( hBi@!@ p(ӣi˹ EtA` <Ap"R+` g, h3A17-Bn:2̂nQ@nэ4&D!m 2h. Lrz2:!<"h'6'G2FtPnd’2mFab(@hLe5<mB(QGs. 9w.ap:Bxy 4GFbCi bm. BtiFFM M;"4\廁``"ɢ stm2AӚ4{HApNҎȸhR'A!AB ZE-9by7pRloKEy6( P 4!4Brm8|4 7th#mfhpP M:7s(͢H.m6Ex@mAFhnͪFڈVۙh@`Fy FD)w'B9A2GF<@E pEP3M t xhb0lE͢Bm@:s/K5x 1 DQfaG@bmYscBtiS(F ;t0itNBpP ˣ`d\M@(R(\:ۖ2&nP(<fFV 46@Q nd <!15im ;@DBtnDQh!;jZhtt6`PdCms7!65din&mzjZ"  fQA4 x eB€AAD@Bh 6tn7MKnh;\D&N"EtnXc 9R-4h`P5 !:E4 Ј `\Є6хѠeb1;Y*Lʀ) F.x(LG.P D&B 29&Mh2`&PqE6'hdQEP"HLB`B@D2 @"pBiM'q@A@@HF@B.CCib(bh4( "5.@\PjJ@4Ip&( p'B M4چ3XDhchLl0))!J BmCAn 66"؁( Hm@6p 6ЂBE @B&ȁ0!VhPQP((CR%0DB@PA0'H@@B!@7yi`P&CHd"M6!\eBt B 9] 2. siBa7Dy.(p.( C:(u@im:xC'w=.E΂ @s16i F5wh /#(mMA\Q0.'\\!N &'p#6CKzp\dE:; :6\"[!.$ K NуiwsBt N\4\!6$P0zDxdCtm &PFFRCE <R2ttM@iѠc(q.0B&Ѻ:6QАM:x"M8ȸBtsiAsH p @!ۣNn46J=.(E{L t0ۡqCt.(k4 \P@\Pi(5IhOXP{\P InMиt2. esm| =&O'sM 'kD2y0lОm &COhO!6 6o&mHP("00oKiѦ Mw&ޖ[0('q&yi04m@ B\!'],*hChL"Ij`NpitwC@ЋPLMP4: @t@ !r#hh(NR(!! tRLt.e 0.4C(НR(i !pc(x;Ɠi6 A ـ FOBpP b(n!0m !q 2E4!.A"AA"(B.n(Bwwd 4 8 ( B(dC@tbd`` .h @ .QPB @\E(`kB(\ .&&R.zB .o wp  \(i2.( !AMe" .(P.4(N(PP0.0.2`;b8DoE NsE0..PPEL &FBAPiPСqp:F X"4B (!:(X"iq@(Z4 zM "7KqAM% Ʊ8M ".4: !I ` B !A0"AvM&oG9p#@g+E d"@;pi( hPhICN 0C|CB#dP>254CH m7`ˊ3`k:e. f!BYCCi{tEwx` lE'CY`2d\is@`PP..\nAuM@s.0(Є0oY OYsF'AhF`vP@P@@#` cI @ (X66MۗFmmyV{@m %AG MиE7 d'B#KM p2(PzMa@Px="(!;{GpM4opinN0@E6i \FN瀃X w7Gitc27EL0lO|o[yGshM&MRn `.t ; 6w6' \=pO'stn(PM:l(ـ 7CKhBnw (#!MANPɶ2n % # i  h4fƐEx %dӸzM\dЀ  44 zA6۹۠n P ` |h F`  Enmptt0@(B 7&`!4ޗ2 )9X ΍ѶN L;f(mnE RE".(Pӣi0G۠2E toHPt244 PMN7^X C9Ǥ  ]izm(f oYF`\E< \& myBoX.7`F@ -(Ӡv]2(\И\; w<q5-Fh4&;P ( فBni(\ N#t(P 5tzC.m4w6(sGC'Ǭhq w434i2zF!=m\ @@'FFp('F@qC"@2ˊmt0ڈ..p!4AqA;nR!!i@@@m4J!L@QB (@P.fɴ q4(PD""!0!B&\&\!.x4PR( H0p й΀!k i(\6ˈ(EѦPBbk hhPsDH16&cD l( ѓM;(&j P`(GPHPp k@AH(-]P )P FB)LsGFP&0AFF`ƒNX !p! !Q@&  ;:;iÇD X&"@'F! Km4M !B!5 ѡ 6!"0N"za6DP@ B`e*A2D NBQHD&(s2Gq@wDB:2!5.! P(Qp 1J!`'B;.&Pnр sN@qp (\5742(B'A:: Dd)B&! "4l 5 E@ E BM .h( &Ph.hp] 2B(y; sL2b: B 20\B.i\ƛ .B)BsP4&2FAE.ct(dw0` H)(#("F cFABBM0QGFC": D!ڈ0tFk$tp @B0.%4""M LК&F΁ ӂ A\p!!1A@L{]46`6MiU&#`@4@* wP5ae Bw40{K"mvnHfG `Pg(\ @&DC!ᦃB`Њe @AM4aP4\ЈCȠRP Qht\0(bnB02@@ ;"h'@"(@ˌЄM;&A&& Fs&`itw=P90Gim"`Fte; 09Dl@}mt 0e(d6 \G4:0bd7GhAF4(n64cMq6("( B@A. O&  X!6 ѶDr&\qZn4;,0n[Q(6 MPs-"-@ 2h&M4ӣU̶ 1.0 mӣL MiFh@4ޖQ(M" @")r\`&y%7Cd".6浫P  րzǾ7"D(NCM:;<:("P`(B )8A BCM*a6&BH!(R Xp@\hE"p12\d" ;7ʨ )Fsp D2a@"B\bB) 0$ 3*"!;E=%Ժ19pQP hm#PD\"naM: !"D $hB.H( j0(54jYsMEpP ::6&@,DBa 4E΁6Pt4  ag@o&PM X!˘!x0\&!\ PFpͻ "6kHFFACeJ.ՔuZmDB\5YR]dBhCw8"+8w6( We1 ِnCHDA(l . B hM(C"! BM Q @PMUXPXeāEPآ bfBup APiM0(pQHAFT6!3'FP M;3w]0;@dsNw+@pO04 P@w.I F`y7F .mF x7A=C!X6Et(pF@7\'M_3mKO9D\s:;tm)n:l2[ >WFK~!x3| #79Fѭ\Hpy&.gq Lb0 7\P;@PP(QﶆCH"( 궍(4sq}拃t|CBhGqLx0 `7絧C9E8'0lx wC \<. =&COy0oYshDm=/tco  &`O~np;p4\PLOkh4aFdƄ! A d .lQAnkh"&4 k(q @H Q`tbmA L(( ApGxNGpiͮF dHy4&n&'GuD:!a \Ў6ABM3@!1.( cP)|B( A" <!2\Q(0Be  ( A@"`#Bb@@L0ismdOiA1Bh9Z. HC.hn AMmDP( !6\#H\&e!::p>HdZ Ce͠N+P!(hȠP\(P.b@ɂ4 B F @8@F nt2 D 1pm 2]MhAmA2 @U dR.tty4PNe=B9nAB;YA| 6ӣB)tLFOh 8Mh6 X"<` 昁1 iAn`Є2j05 cAA@M>0 !5y3hi`22hl`(C`0y'HBm `h@nPi6FȣB( I" 8K&sE .b2 PA iK!3CFd# l;@1DPPEP@0Hȇ! Q7Y7 ҏ(3X"uKP5s;- & D"0x0 \< iD04@ꈡ&)("!4(P(:eL.FFA@E'k9MEm2Ff@d &\)\QEQt6@ $Mo&B0B"nmw0@`\`P 2An่ 1zPp҃@N@AJ d] NKPP(CICi26@2g86ˎfpndP A 0(PB.QH\P(&m6  pq bw&".E m5GHp# E 7NhB5xA/IP#I@h@m`CTDCm;.z` !]mChn.bm'w ipFo0<0FPMM:6^$MB /t i'K>GXM<\&[ "m(%OtmKG32|sMOGf6\FR6D!e68].7|!tLAsD4 x= 7HbhqBtB"t @!(' kw p"(LD(i*th29т(#\  "€7 "q@B!⌡h\„Bh!YN7:\]0hAB(&PFi Km. -bMlM)ht7lqBLRfP@B<*2684(N!F6w $iP FD4=d"!(`P(`ȡ\\i@" ottIOK@P46QMBq ^ 1QD "Y44niPA s%5|;!Pѳ'BtC5FRp(AB!0&Պ\&I0+MVjaB Ht6Nn]Ї 'G֋0bmd  Xi @HHc E@ HՑ#5EC<;`0t0hMtq2t{@KP 'pF MQ񽮇+t2`!< &n.0>C[!t(/ipNѡJHM3u ;'w <MBo L;@-hD#[\ o# o!ppNm 0 Gs@.w:\Ύ x`B2tm>PM AqBF(@7xtj`\ M4Qt(\s@ kz56؝ 4mi0 LT ɍRh6x7FЄm@mm\='!0sgF!w%` PC#Yq@''l(B 6븸PhEH 4'N!#t}QSNo`fe7 \\\FF7oH ix4=4ty:0M: &oXkm6.(\Р tef@n^.nw64mL & P(D"+Xawd@ (Cw 0.t!Cm#kBKF ]C((7L@!0\m"ˈL. 2PfIp x=oHs(@z!A&k@MF퉛A0PiBLCf\ ! HX)d0 \&8F H Ml(Q 6&4'\T\(4Qh2  ."xEbd Eࠊ2qA{XBw]M4Ds-<%4)ȀF2!&LMHHB(р6ŒF4ӠPPa7s 2`ؚ"@m  Xs@.B( L&Ld@h!  dMM B0!67!C7I 4 (!LNq HE @teBEFb2pQB@d8`PP@Bt @M:87p!LB1;"n4ir4DJ&asF@#&(!e 4CLBBdB6P0fbmK 0NxB(V!\sidAC!!\10. 9B̊FЂ6<HPf\ Hp544t()B @@1 e hMB00(; 6"mBA )-6 " D( @B  )e.46 `0@&PcP!4k"(P) ! d(& P(Ω AF 1MV""P".{E" ShP&iKE{G@ H2с@AFP (B(4 (2\؝FmmPt! Z 4iѦB.EMhP]L.@!43HhQ@8(  M6a@e-ELiA A hh@@ M;bwF@ڄƆM\QPF@zwG Ph rR&; (И ;0I{Pz ]M0 "X`(@@ P k."m h@dm \5 "`B L(E  \ n0 QC ohB(@@3'F B:1CHh@ (:] PAswD@#\e.4@B"C.{X8d>a'M>`mnei Ùmn44 " sti e&htN4Ӗ!>G=`,ĠыKыKw/bPQIcSK ,J )._ J )*\^bTP\IҲWV%Ġc52%r֬`}Ѹ(IIT /tp4..h\!7Fˁ 2n(k% .  4P("ࡁpA@ A  e p@"\"..`'@`P2 &`.t@e"qAPP0tkPBm'B.;!PA.PoE N\@o.(@k("4P. 27@Ep @iDQ&z@ F@AA(P BEd\t@@0.C0!.ABP( .:0 1 Ph7L Ape(`oP@ `Pk(!o" 4P (i  P6kd Odk2..Ap Hѐ (" %@A" C'pm4`Ph `\@.e 7CB(\((:t5р( ,i`:4m`B PBp 5@.Pp E!.AӣFb!0/K@"\qA< 0E"`P B  B@E "(A"2 C P `.A0A\Ph h!.P`:EM7Dd\"XP2F .(!FwJ41 "2 tBh@ DBEFF\q@2 @AChk p`d"sɡ(q@0E `iq3 E ! "!4PEACK`'Bpi8@ @D E4i@P5EB @@d L0ЄPPF ( @ @;m {tt7p6f] J4 (tAуyy40(`QBo!>VzEM5n<i`:7DސFx4@ 0E.(nAo22Qb'yim(# E 70mMn9nnZ..(d`@ ` 7e 6m0 :hm\  OA6 4O'F(Qh#w \ Ͷ4ptm\#`\ "P NpQ'mm4e0yiFGA˛a]M<=&YF f 4ǀP w .hAB7-0mh Fsr;(fh@M 5xM4ɺL m(!&2P.0eKMkl<p4#[O@ACHqAK ·9FڗF(`L\hCG ЄуdG;ttf 94"ӡCN`\&PeÖ.iй (P=EPw:6-7pd=`'pQ0Qeͱ6Cnmd tD bnd؂Feaq(NeO'qQ< 6J4`P  l2w6e` 5;AAGFn:P4'%E'=׾ix;ltGq ѠhE{im6A hOYڗ6AVL"⎎Ip nxnCp Z"+Z(2"#H JЌpH $Q킇Ch 4  PPApiEM E\(@ @RJhp6 M `xH !( "M!И 1E &:'hMD1J (2!ї@\!F`\4&!8К!7AP BnDhM0R(B.im0FP'QRm̛FªtR-h@` 4&Դ&(8QhLї@2C@B6Bm1DbmB"4AF#[l.i@CBP @4` b"hQ@CQ.m4)N0BRȊsMlN.i•R 8(bt(E. E l0n(.BЄPtQDQ`IC۹9mx.n M0iFd!M x="F6B#<؄Km;  !qstiM7F`礸FO| 6D@QbfMFQѡ33tffXQޘsm Kff[i6 @m\Qӣi5^N\ҍFmL5oti F4"2ein1%mmZ2.PFQ2 wFB0tx:kw:.41sEͶ͔{ NH ..6݊4lF[PmipnS| oto. Im4Ќ =eЍoIFC|aCEk7O&p#"2xCu[0w@=%B(QQ B . o[d  s4# G@͢ubtti20 Apot8J4P@OI(#mPt(\s0 %`LdPi4   @'Gsi@Pm (/ i477!=aqqi Ћ('s DEkzBn y6]w6C{] A@ F#EM̰\x< wBs &M4=ҍ[ o |m{Xdn"祶7C" nZm;47tͦfe" Mw1Ek@tm.m7K 14\yFȹD 4Asw AsB.n:[My Оmd2l،hPMAF\ЀP(` wmњ˹nfl˥Q %0 @". BB⍍2p&)tȸlM2 L@IA6&4\PP) QMABHl(PnFˀN2lE"M6B!:@a\q`LlRdom2((@SA h0e (Q! 57G)\< LEH"QIL E)(mB( (8 @ aiЅE@ S"2؜ QH( Р4d`i2@" .P!7@M `CB(B拄P@=&A.tEm(416((R(tdNZ j &aB 6mт)jnlCd!  4'A2&!ЂhP!@CY[\IpW-fcW$ָJj˶$ֵ `yin[U!iTTRk$3؟l~psϴ>'돫?*~d/bPQIuhbPQIb3bPQIr41($XLKK,yĠSYbPIERc̼yi&QAr K3Jִ+j6鱉AE%K %cp@ĮW(,I}JW&TbiR`2Wՠ97TX,/.[@o!n⁁p(PF !Ē p @Z 2&dPM B(P&4>QFAB^  PA::L"dA ! E΀fBhF.h\Q` #\`f(P@ȣAAh Aqpp(! .&E \PBk0(1C@ `!yB. 2!hxe  \Ai @ (h5XPdk˛tnmȀ.0 A4มAC K pE͢ E AM  (zL K..zYC"BA @ ɽ$@p(PB2O !P@ . .0LM4. 4Ƞ&!!B(!YCX `  h`FAd\`E(.\\&(P"=n i(P (p\2 PMt.0\ 0BAq\d.x(P@lE (2&64 (\X!25h(&h Ͱ("0E 'A N@qGse&P\i064(#!!:w "X2. Ce!" B޶(P(PS.g AaP@P@e;"npn0A@.( !w0(PAp&( P" `P(0 PB\\Ӡ\\\\  x4y"H(i(!2! QzC! "PDV" !Cn[m4s3 twN@mZy)t(Ѝo\mẹ\Ѷ  aGF(=/K{!Ah.mx(E="@iJp@7] !A7 M=&F2D8t NMсGHP\Fk۠( ؊7G@pwwE 65M;"tywilA0 Ȗ\P hM0\\\POkCɶإw="( E w i{w=-7Gg\4`LM.io|F@s7FG Bk0 " mhlh8sN80x;2 @T(P";{`on'plF'@00 )iAmL'jNstw64k0.Mw< -Q%FA0hhhE%m1(0w=-/!b5h\ MN0D&n瀆B64PhӸLM=!s( 0 x< Єy4\(M KEɡ:3El\x4dBx::F&˂w6 4Q4A7B-l`ic@@s-Ll;j"Ex(ЊG;m-1'2(6sqANF q. R->6&<,(ِCMr|-d!LQm4렌\t0t4ky4Lt2lM=G5ۣhOA4hFGFHPɔLw\Gpiz@iA:4e:6PѢ6M- .z (\@" -@PMhB('GpE&C ѱE.2n]M6Ӗqx @VDTDP" M16 2 ZQn QGH@`d t !@MBa@!H BSL@"F&LC`\ѓ bb0jpA̦D4 (NLM&RP!t  &`M (\!" h.((Q@ 7Aq\&bDCQ"& C*AZ P"'HM!IBm 4 @ 4&Pb b P @b.eƁ0 !m 6"n B 8 (!h!5( &@0P0 Ȅ! bn U@P#:( S.!x1"ۄ As!52(!ͷ()-74c7B@R 664f)A ѷHi CrV bi614’B!im@(‛.6(0 "( 2`(`F`RP @ m@B \bm`2MP(;4Ӵ"hQ\QVh@`!  P hD ((!E48".sM0Qqi!q@nDEe m.eEB␠E'MӸDP(wtAB*n ;" C-"B.h6E` M7Am@ HsLN1C@!H"K: `2₌L60PNhNApLP2R  DM4!5 M \#I@2 4)`2"FhNokd & oLth- (.&4i 6Apx .w ("2d .eZ(@"m&Q&!"#j( AAAR d2Ѧ% ‘ &E./&w4@FP18i_@‚&6&*2FQ(`! \"&&AF 6O6(P@;Mm.!6&ؚt &QHB\6 9P'Gp \ M4" \PE)ah K6F]-8.w1.(& 1K0bthL\D4a (cAV@DI`.nVЙ2n;CMU'AXPh&" .&B ʲx.'F0 " 0ɢ* Ɏ@ #) СH ؊(Poh((@17sB0tf M &F! QAM:lAPP44d…PB2e$mPV tAwp4UMPRPk&t2a!@TLPN5,(P7BhŅĚ%I17 @i%oas&F&SQVs0lM^ZiQ8ca7 Cp L&@P<!Vi@ٙfə̘:Ԕ&ɑDE*+2m AE ÙJjUEe͢h,XPȚP* 6&n,"4thAю!9ˀBhe##.l2Uj!EyțN舊!*_x;x(ɆtmAG[Ԏrn"OK`Qw Ό@<ɗ34LУFӄpd &\VD6r6Cjl$UƷqHߍo,qIth(!jХHP̣AB PtPRAq PB n:0p& a BBtAitj7"f,"l wK"e)hr0C(QH(pE[DPC[SF:;4„hC@N A{ECEG%41SFBHhBJ")ChL(5%I \!Ȋ6IsB.nZcpPN%@UtH_Qp8Ch H TP)®"Rrl*MG c(!mJr! tBpPqbbІ6 "rE*ڱw @ZX*dgFBXR]Pd)~*Uh 硢N R/"%2,w"ֵa:Yf&f0"6_yXxDAResv3ZňrsijCBuJ( "o;SBr֛6Ebq UtETWGCr-ZgUlCтhm4@-VDT!9RшMJm-tìL8%ChUQ74"80*f ְ| QP3R[:WÀʹHDhhѹ-RHU* f1ތ<ƦgB6LNmcJť^lB/L_WEkdX@@^T4$JTY %֨\. x7Jr,\'>O>3O?~3'䞰/bPQIj͉AE% ((lJ ).U7cqAE%ʦ KJSKOOJ+ %: 2 ,`XVZ훉2 )0U.Y, bRT%|$j^iX*-K2G'P88QdW-LG=e90Ap &F@qP6E "(\d QA(nJ(\!\PP! и%P@ i(!4 ( PB(#t.\## (( DhB0` t .(PHAq\ YpKJ. @@@P@6D\ "ุ @AFF&d(BE t.e32 `\sC!PA s0.'s dFB @k.(`0  0m . !&2t  L( \PB@h( B.i2"54"C& D.`(Qh2ACHM@|F .@aA0 b.B0z`tapPx(i "M(P.0@MBDP. .as0wD Eȸ!1 CN!A2As.@(`\kP\`Bb(ѬNBy 7b5( M!ޓ( 0`\\"4e dP(B M BpmQ1p @`PFp"!D"Ѧlx@!4:6 4B.(d EP@B.F ""JhO'B MЛp'P4&q9J0Pi7J6 @mdd `0lAppP C&F&ࠌ b8E : sEqpLP (A  02 !6ޖm۸OKnnm y# 5A Mp&x0"x`PM ApQ!6:<Fqsot;si3[t6Hi.qBBx5x&Nh&NnZmmFӸA0K`&P [i"rܦxjH@" s7[t(Q"P 9MAZ5`۸.y6Xtw;7sPne6F20.. hF ;MLAF.zt  E@\ 1 (!hqI``FFh7@='C'GqG Gq@4QCXk#H\`i %5`:zCmސ="l5]G@ȣFo"๶͠e/#N4bs& C"  M&ؚ(KA4'mM42.(|2w1h#Ip=m;|F`\G'pLo|("i6;PAGӠ7@7 EKB 'A@ @Q&mMOXwBd@&(́sm4m77@ 7BqslB 9h(A\ & nN ȠoV(&#nGE %sCht44 hi8]GOXPV r pibLDFD0CX4 i PhDBdQFt\4` A EwJp"0\"X2`Q0QVLM5A6Qd'D.t؝jE)(&& nPɴ&t!V@AP(  AHrAQA N !Bb &0hRM 6C 0E 8iwp(" M8j!HE 0(1( )`nc( \CjD( MBt!#F Ь  иѢi!2(р @LO"( 8EEAF&!:(0@@@20B4R `Q@b biN ;3H F PT͢(0"BtmmmT P!L@lQ 1DB(m4"bB0AC: K("F԰ E%ѦE!h&Q9m@F!6&؄\Js(&x2(# !@"\Fnht y4"A5Є Z)4PPM();m\2M2\Q*y2"@ @! Q E+ E0NAal(\BjQ pP\EtЄ8: Bw122(\A`8h<H&4 EafpE4"Q O;  P@&.0eQt]ؚaN рPЄ". *&mhLPU.wKP&  FL&)hM&PDF؁16&!B6ht4ŒCx Bj"BchPh ۡ *B'H@16(]@AFก6Q T\5 " (ZhM46(`(.iB 0E"p\D@&qsM e 7pCC PE C.F". M:<@(E$ɸA Chb). 7( Ee; 4F 4R2DEb "hD!.Hs'F2QP*6Ԕwi20c EуPi)q (!0\P pQd !10i t(Q;4"@bcFQq@ P(6S \!  Rd\!B!0y 5B( @@ @(A0Bˀ&R]h4 `ap&1.Pe !".(D@pA6t\e `PU t IFE"H0.hB(\VDTShxBhAp€Ъ!B")QX S2r f]s.T@s4HnB A tm:txD УMM.`B@IsFڙ(b cDBlnlx6l)-N eG3gGeԜlRQAq*_益DDD6fִ̦d\!7JR3ε i˗27BE56ȹ/.5b" `78:< ɣB(m!P1[s$hܣ"7/ .`0VEiXN(DV]8lNR)4j@e ֪"9[6i.'f/N(6􀴢U"QE ِ\::4jR!CiFDN \hDN\T&hD9d"e"pB+2[ɨAHI`8hl@J(M:@2U(18;(!: B :E֠a4"RG-UL Fe"epC`\Eh! R!6mQ pJe"hnNi!pQ<h&"(!5-)jB!JiM'H #!D5' m 4BjD&)C)(G$Q EC 'L:P U017B! PmY6QKi6 O&4ad:4ӁBm<@-5C.(L‰SsU\K U0h[PuhQ:8V(;"6`!I sHEKnU&ysЪuDN6juIZL1M.GF2ࠊ4a]kIF1g+Poȿg,2/vYhmq/L էZlA fS-0'IKTjn(12%1Ɉm*L%!lNqs;Cm"=MUMA&13R!:(Qy#Vk "Ac\ݍcg\f8ɽ~-2`Du0UԄiHb 01 dE؉W ԑH q^ Z\qeqVqy7UfJCI%q L}ٟh}p}៫?~/bPQI W*(.\yĠĠS%OL& ͉AE%ʧ'SE%KaIQIrTyҵʷgĠSjdQ%rcb6,*̒ q pkN$*,-k2l"0aс A礡p`Ћ'pBp=0#|at\P(" "D @ 0(\Ѵ.cR"A@@. AJe;(@.w`P \ECPB("PB"&4OHP(AqQA@p"zࡐs @4k \ 6 M E(ӡF06PFFq FEth@:" (KȣEP( 20Ps@E2aPzE"t(&!!y1 Ap(\qA`;\p @lBhwрpe B(( :AHL`` E\B(k``P `P p@ApdP0qFpE(d#4sE! pp!4  Mz,J +0V5ՒڴLN,J )._J ).X+/:Ga&QA%K JXַV&Am\+bPQIRcҷ΂TU.PXҙ%fm_~w%JnªX^kX} e 剒ҬkZm:;mDQ6Bntm4‘Ft2 PB.0p! CHpLPfЄ F\PЀPpEF42 "5Ft E p0e p5hA LE!@@Bp"H B(Ѥ0o.cɅ FCp3K#Hm!.  pQ 2(ˋ(4  P\ .(kFm(2. iX A< Ph %!&@(b.#:A E  `4 0t P#F @!1 ;p  s@Hi(PF b(44 pPEB5h. @ h i@B0(!@0.(``\ɳAq``"o iaswpkaF#A퍢aAwB.4 ЀPF@Fq &P4 JO@mcpP!t\` (`\P` (4# E "(#\ ` :04&A@0QqtPE2 f. D! 4( FBd`ˍ&и4#1d&!7 `3 w P4ePe`POYQС (Ӡb4 "&\qqM@ FH0ȸi.(P"LBhN(!2t@E .4p@wids(dq.@C5!(s@ 0. 4A@Ƞmt2 ( .. E x0NApBE @ MPAb]/ ͭkkKymoK( r`(ܴM PF`QGqth.b(Bb:9;hm.(PИ&Fl Rٺ"m4'0t0  hBmf]M;IqL2kf0m C:;lO[6mE.! Pw6t58 QQۣȹs.y( @&nX@!dt 4"`QBr@&C(ɹw7BKN)h0Qs"nw[RA@ ,LBs.Rlmo..6Q xTBre (sO&y.mmk0 +mN!4e." (e -KFAӔ FQ.&ǐFd`P\˘M d c\Й@B2txF" imЊFr 8O[M7́FxFM:( 4F!4PN4@mͧdК(`" 7Aй#t8K`{FΆѤP #!7se idhɌ`MHQ =<`zM&GB⑤EOAGnfF!GFQX(# ѻmp4mhN6(jeEtmM @# Nt mA7J@`siͦStO&x aѕ (\#hBl(E(`\Krti4&RA0ڛJtr=w6B@sisC6IA< AHB筹ts2\НΌNi NZ=% mbe .dQ"+ZRQM 54fj[A2 M ;@@ 9 ̴B4Am@D Zi4Eb#&n:;M%d4d#X EB!0)/p(Œ8$1!\F(`Ђ L ȹ6Ztd't(B $V :A !67t @E ڂ( \m \"q3HN@:)m";MBbt&AC" mm"1HM@ 2mQA Pp"@hB@(.FD(B8\&4\\P Be 0x@P@t4DT2."(h ! wPAs4#ba(ӠPP:;4w@h+Fh  4  t.!1:BN4@E @Q&:(&6΂ `\B"P B`'qE)f&@`AFBѓNBZid!"p&8N @tpiBdAA@ 4:6!6Ip(l0( mpP( JxJtBm@ Ƞ\Ap"Kq\ 3ЊNAq@&\( @E 6\\FHaP 0tw(4E(Jd 0M0 "BhBaӣQ  Ӻ. 2( w1кh$@&@S@+@(P4'b(!1K@ PLDFEF„ dP.tj!F "(`HQ 'sPA &TBb`(dP`hp!:@ 8..)$PDb@ ͢hNࠛh: 2 4@ AXBAF(M@nG7@ weѦ@(Kʍ @M6n.Q.""@E "F BwmD'p I!!:3GspMD!A (:44D  ˙A( p& PMm:@CB@EAeZC(J6 HA!1HІiB 06et` P6K(p&Bph0"0("BA&& P0ӡscw1d JE4ЙFhB!4 hR7F1C.lMΐ:\#mJ )a6)A@@H5TP4 Kt )tD DQ@8LA  6lMD mJy@ @|U 6FC6i\˘L@PBh@: 1s24d: VA@p\6!E0 ` t W` 6cw (*P 1F(F'B0qA@ A (s@ilr0.t((" FdPB! E fAB Cd DT QѫV3Wc& kš Vg aB0kWGBהtR 6tN瓙"P@ ^NNSMnCw9Rk&JW@ډA@ih_.\'*E*m -F (',-V†P&Q@B -i4НkV\@ x PD@27E Z)a(iJ5-nt#r(塎@(.qB(\(m%Oe] 4 (2Z_XƦpR۴:LD_k@A( %6W`fTEk5s-ê&E-3 mU"Vw9Q RHۥkUB(F5u 7̄tnnhPB :c.NrcjSPCL:@DPBw%CӆAF(\a EA1@+6&+JÊ#6 (u) P4"nbu#q@N0,Q !Ѻ+0jbtUM Ba!H\4 nN 1Ct8tjUD ! 2 h.]lQqm0aGvw ˆVSW[Pd BmD<tbE;]daͦeX!5)PӖ`&V a@t SL'AA40(bSȂ 6:h BҮcRdDQЇG[gR bj el@ "nQ 2%"` k,w@EsCF5J6MMBB+Zʍ@5sVn-GvIv]!3IumW1F5L-IDD[Dh@P-jA U%Z•.6V/mjVz9(o(D+1G΅:7:@Id L*0+) *#MИ,)i( E*eTJ"aիV&j8ښCo1õj*Eo8|;!jf؝h]hcW_bѳr\W&#bo1jyU[F=Poxvש)]Զ,ncF2MFWf$jx!QPAeB@-%^@"K }\k%^@l3[t^b~O? cʟ~~9?$/bPIElĨIX((GlJ ).U>y\`V4MkӡAE%ʦ bPQIr^dTڵ+3veH/,TdZpdq1((`X^h5Z (eL}qFfmXzwpI\mZS39Vna]%A*XQ\y& jfk_zFN96|N PCh6!B@4P("\B E!#⁤# \\PyE pB `P.(h@C E ! pBhAtQ:=fAE "'F!04C}F0 " t4˂0sPfFs ps@#HB)E 3IBP@ " \! \`i'@. p`b`&\4GB s.*PBt \;2 '@AA 4Є.!FQ #hD Q Aw4 "(`&\m L@.Ћȣ4 e pȣFP4@LE  &#H::(@ (@@ =!p#M'ppP``A<.7` 3"0 lB..  0@4(A;E@ \.\"@@P MH \# 0Fd0& A"E(P@ 4"@1PȤ 6;ɂ !4<. b.(5(4P6Є'p(e08iѡ4dd:ˊ:@NBNLF M:@&AEɠ L M ;8LBLbaF L@m4^ a!<PBt  (&`#Bb.&pp\򋌄 .(44PAGA b#ѡF@(\M 2 @P \"!P\@(&H0(P! 0Ah# Gp@;"zB<yFPEA@E 4 2B00 2(:.` 0i!0+F"&PD2%7p 6iL\ͼECiphQ6NME@(ЄFӸM4k2t8twtw4M2<="`:m"Jd (nF w "\@Zx2KB@\`e4m(Ҁ|@P,on44 .``P6$t !BJ(ӣи#t2ht(  [eMbzZ; qQ::7\'P.tofFBaA< x;Qp[Meoip0eD>fӡm;MM:6Qxth&lPm'tA 8n'p̄8CBw a4\iMJH ! BwMA e(!:N+@BnЁDD) 2QFt&B!6:4 OH܅@i\&tth(6$! 7Ba5 .mH e͍&2'XPbE2L)շn"΀ !BhhBm&J!(@p! PtF6j@)Q)"((. .)  0p()J0&@..! jAAbli\4ۄDCNLP@A FMnEP&NHBQэPCF qm" Ddw 0Ch0tPBh]9C CC(PDQ j iPFFp&\(!Dn DAGAa@N( E"R"p`RP'@j()nƝ7$& 4M`#N&`؅ PP'-e*TMBt`!i8 A"H m@`B.Kd% (L lB5hQG,LBtmM\2(PD P" 4QMD@!\4&"PpD& B &B`"昛hP.Bhw$6QR`QhB. M@EhMr& 7P#"Qp'BC(`ap'@"NA IFpCAF0hAUP(ъS4P4" B ̊6EwhiH6\\PE M:@40MHL:Bh(Rmsb@  NNaF'A6mtwJhhM"h(!Ci@@ A2B^ !*!@ [edNҥ.lP!&Pua "(hPMPED0M \Ԩ. 4 DРFMIsD A1sDDE\46НPBQR,@'Т&!j 9!b%&E(jD!0m "'A4.Thh( N‚ BA@@)p!2Cd\L B e lE (%6s$Ft.Bh&BeDjZh]Q@EMIR Lo L."A(CF& b.LB.twEĂ4'556( C'AE 0wT".RTBpD4۸Px6UPX4Nِ"@QSG@ ! qBA(P #& }H @Pb;Z](܊ ad.nF HLEB@KMD3#JAtiM8Khp\)(Pt&A w47C( 0_̛hK]((*C.40NN pQB-a) m,Ĉ @U.n[Ap#Uq#@nfA 2AAp&Qi7 4'#`Bh@ Bm/&nVV15k}2Mk,^x Kmٴ:157fm%54)jA9p9,D: 8S#DFQ5$Ony &M60hD7GF3Bj-/l`n!CjSj"灢\D"Y n\&1yJh Jn!68c![h ˙!Dn7m49j FMjHL6vcbM fJR 1E@ CN(ݛ\hۊCxB`s 4:6aBPLpR%5.(6چpȤQ(TCmVX!hhkMb[A(D0ŭd:fB0,Ӭ[giQfς+l#=J$B"(D*)W n)W@BaGA!1D&9 77qDBh6%eZEh"4z) ؂BѨLm `ˀj  a@ &"Z@ڪ L !7@D]* @c@Ĩ( m4 D!&1R(JBQA@PMGA)R" A*Zp( P*8( rN聸&(@PJp 0`58D&6E7s `CLnFBbbb [C!l.v 64*Pۊ)7BF 0DD!JoDDUPhdZ(.kiq_;Q.5Ze"(11Wӛ_()1H5P% jj V Ѣ)!U5]XE*j1MUZ2JiQ6nae m(0V6V8[_MP`KQV"5(ٲTP |RL8lSZbUsL;Z-,MNj1u hv$U{Zwb9#Fկ*Ft[ejHQ,9j *g3 W" 11jbyT& eb1vS (Bn1|ëP e 5Vqg}/5#Dm7٢ 8[7%B5\WI͉WkUNI;[8a}mqpcw$ϓDWk:R7rsΊ[,F*+qr2-bޢoz&fP/%PR$ȱKkI\H\ƢR!#\!\[ޟ?F3O?2~T3=`/bPQIݚR\U?۳%/hbPQIr1((RTXiW]:R\`"wQ\U,^mZ LddX**16kJfpo5 RcJ^bkYY %rĨպҶ. j庙s+-հ$Xj8f&Ks:$ɐiY,K.#r @N[mQ-Bi"DAA4\C\ pn4 C@1P.b@1 02h Іl :\k(s Ai@1ZP 0P. B๎D (!B  Ad!04 ˂((`@wBe "t@0E@" 2e0:4:E 4LnE A4@ !"bhm@oB(qB`('s( !BJ4:FP"hB M.t|% 7B t b:E(qpi (( &F`BiQ(` Њ:k B( @!;\'N †0E @B EAP@A " mh(FEP# PE0Ei" tt("w!L OC@teE  #)sEF0ȸ!:< @##( . (apeb@(Q0h" ( E҆\@zA(P@!A Ci.C0dPhN(".6 0h6 ; n!(!(۠ 2f.@ x 4.(eABt ((& F铣M ‚iBl(0@PF\!e ii 0bhBB\.hB@P."(C! ;MP`pAHE P"@y04  ސs\".t.hAPhш('p"!PC%Cks@od(B Bbjnew0 s@N@Pt.0pLO:6@@@2(FAtMAF QL(  m; AIi tm!mfSNxtzD Ժ w4#hi(dܻdQd (k⍲M` 2 < CKb8`zZ.xCtmQ\ (.6rh\-&@.sFny:(( hBi@!@ p(ӣi˹ EtA` <Ap"R+` g, h3A17-Bn:2̂nQ@nэ4&D!m 2h. Lrz2:!<"h'6'G2FtPnd’2mFab(@hLe5<mB(QGs. 9w.ap:Bxy 4GFbCi bm. BtiFFM M;"4\廁``"ɢ stm2AӚ4{HApNҎȸhR'A!AB ZE-9by7pRloKEy6( P 4!4Brm8|4 7th#mfhpP M:7s(͢H.m6Ex@mAFhnͪFڈVۙh@`Fy FD)w'B9A2GF<@E pEP3M t xhb0lE͢Bm@:s/K5x 1 DQfaG@bmYscBtiS(F ;t0itNBpP ˣ`d\M@(R(\:ۖ2&nP(<fFV 46@Q nd <!15im ;@DBtnDQh!;jZhtt6`PdCms7!65din&mzjZ"  fQA4 x eB€AAD@Bh 6tn7MKnh;\D&N"EtnXc 9R-4h`P5 !:E4 Ј `\Є6хѠeb1;Y*Lʀ) F.x(LG.P D&B 29&Mh2`&PqE6'hdQEP"HLB`B@D2 @"pBiM'q@A@@HF@B.CCib(bh4( "5.@\PjJ@4Ip&( p'B M4چ3XDhchLl0))!J BmCAn 66"؁( Hm@6p 6ЂBE @B&ȁ0!VhPQP((CR%0DB@PA0'H@@B!@ S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03 S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03 NOMINAL 2015-12-31T23:59:59.999Z MTI_ 2015-12-31T23:59:59.999Z WGS84 / UTM zone 32N EPSG:32632 10980 10980 5490 5490 1830 1830 699960 5100060 10 -10 699960 5100060 20 -20 699960 5100060 60 -60 5000 5000 5000 5000 26 135 5000 5000 5000 5000 9 104 0 0 S2A_OPER_MSK_DEFECT_MTI__20151231T235959_A000123_T32TQR_B01_MSIL1C.gml S2A_OPER_PVI_L1C_TL_MTI__20151231T235959_A000123_T32TQR gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml0000664000175000017500000001710714020414370030677 0ustar eveneven 2015-12-31T23:59:59.999Z 2015-12-31T23:59:59.999Z Level-1C S2MSI1C 01.03 2015-12-31T23:59:59.999Z http://example.com BrowseImageFootprint Sentinel-2A INS-NOBS 2015-12-31T23:59:59.999Z 22 DESCENDING SAFE_COMPACT GRANULE/FOO/IMG_DATA/BAR_B01 GRANULE/FOO/IMG_DATA/BAR_B06 GRANULE/FOO/IMG_DATA/BAR_B10 GRANULE/FOO/IMG_DATA/BAR_B08 GRANULE/FOO/IMG_DATA/BAR_B07 GRANULE/FOO/IMG_DATA/BAR_B09 GRANULE/FOO/IMG_DATA/BAR_B05 GRANULE/FOO/IMG_DATA/BAR_B12 GRANULE/FOO/IMG_DATA/BAR_B11 GRANULE/FOO/IMG_DATA/BAR_B04 GRANULE/FOO/IMG_DATA/BAR_B03 GRANULE/FOO/IMG_DATA/BAR_B02 GRANULE/FOO/IMG_DATA/BAR_B8A GRANULE/FOO/IMG_DATA/BAR_TCI NODATA 1 SATURATED 0 3 2 1 1000 0.97 1900 1900 1800 1500 1400 1200 1100 1000 900 800 300 200 80 4 3 3 4 5 4 4 6 5 8 61 37 0 46 11 45 11 45 13 46 13 46 11 POINT 1 EPSG GEOGRAPHIC S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 S2__OPER_DEM_GLOBEF_PDMC_19800101T000000_S19800101T000000 S2__OPER_AUX_UT1UTC_PDMC_20151001T000000_V20151002T000000_20161001T000000 S2A_OPER_AUX_GRI065_PDMC_20130621T120000_S20130101T000000 S2__OPER_AUX_ECMWFD_FAKE_19800101T000000_V19800101T000000_19800101T000000 0.0 0 0 PASSED PASSED PASSED PASSED PASSED gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/0000775000175000017500000000000014020414072020773 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/0000775000175000017500000000000014020414370024440 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/0000775000175000017500000000000014020414072025534 5ustar eveneven././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000775000175000017500000000000014020414370027735 5ustar eveneven././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000516214020414370027743 0ustar eveneven S2B_OPER_MSI_L1B_GR_MTI__20151231T235959_S20151231T235959_D02_N01.03 02 S2B_OPER_MSI_L1B_DS_MTI__20151231T235959_S20151231T235959_N01.03 NOMINAL 2015-12-31T23:59:59.999Z MTI_ 2015-12-31T23:59:59.999Z 46 11 1 45 11 2 45 13 3 46 13 4 46 11 1 POINT 1 1 45.5 12 2.5 0 0 8 96 43 158 2304 2552 1152 1276 384 1276 0 0 S2B_OPER_MSK_CLOLOW_MTI__20151231T235959_S20151231T235959_D02_B01_MSIL1B.gml ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000775000175000017500000000000014020414072027734 5ustar eveneven././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B03.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B06.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B04.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B8A.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B08.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B12.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B09.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B02.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B07.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B11.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B05.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B10.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCD$E$*Sgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1b/S2B_OPER_PRD_MSIL1B.SAFE/S2B_OPER_MTD_SAFL1B.xml0000664000175000017500000002374114020414370030100 0ustar eveneven 2015-12-31T23:59:59.999Z 2015-12-31T23:59:59.999Z Level-1B S2MSI1B 01.03 2015-12-31T23:59:59.999Z http://example.com BrowseImageFootprint Sentinel-2B INS-NOBS 2015-12-31T23:59:59.999Z 22 DESCENDING -90.0 -180.0 90.0 180.0 false false B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B8A Standard YES YES SAFE false S2B_OPER_MSI_L1B_B01 S2B_OPER_MSI_L1B_B06 S2B_OPER_MSI_L1B_B10 S2B_OPER_MSI_L1B_B08 S2B_OPER_MSI_L1B_B07 S2B_OPER_MSI_L1B_B09 S2B_OPER_MSI_L1B_B05 S2B_OPER_MSI_L1B_B12 S2B_OPER_MSI_L1B_B11 S2B_OPER_MSI_L1B_B04 S2B_OPER_MSI_L1B_B03 S2B_OPER_MSI_L1B_B02 S2B_OPER_MSI_L1B_B8A NODATA 1 SATURATED 0 3 2 1 1276 73728 4 3 3 4 5 4 4 6 5 8 61 37 NONE 0 4095 true true 46 11 45 11 45 13 46 13 46 11 POINT 1 EPSG GEOGRAPHIC XX EPSG:1495 2015-12-31T23:59:59.999 0 0 0 0 0 0 0 0 0 0 0 10 10 0 0 0 0 0 10 10 S2B_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 S2__OPER_DEM_GLOBEF_PDMC_19800101T000000_S19800101T000000 S2__OPER_AUX_UT1UTC_PDMC_20151001T000000_V20151002T000000_20161001T000000 S2__OPER_DEM_GLOBEF_PDMC_19800101T000000_S19800101T000000 0.0 0 0 PASSED PASSED PASSED PASSED PASSED gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/0000775000175000017500000000000014020414072020774 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/0000775000175000017500000000000014020414370024441 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/0000775000175000017500000000000014020414072025535 5ustar eveneven././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000775000175000017500000000000014020414370027735 5ustar eveneven././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/QI_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000775000175000017500000000000014020414072027734 5ustar eveneven././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/QI_DATA/S2A_OPER_PVI_L1C_T32TQR.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* WWBCDES././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000775514020414370027755 0ustar eveneven S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TQR_N01.03 S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03 NOMINAL 2015-12-31T23:59:59.999Z MTI_ 2015-12-31T23:59:59.999Z WGS84 / UTM zone 32N EPSG:32632 10980 10980 5490 5490 1830 1830 699960 5100060 10 -10 699960 5100060 20 -20 699960 5100060 60 -60 5000 5000 5000 5000 26 135 5000 5000 5000 5000 9 104 0 0 S2A_OPER_MSK_DEFECT_MTI__20151231T235959_A000123_T32TQR_B01_MSIL1C.gml S2A_OPER_PVI_L1C_TL_MTI__20151231T235959_A000123_T32TQR ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000775000175000017500000000000014020414072027734 5ustar eveneven././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B10.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B8A.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B04.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B09.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B01.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B03.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B02.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B07.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B06.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B12.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B05.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B11.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000775000175000017500000000000014020414370027735 5ustar eveneven././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/QI_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000775000175000017500000000000014020414072027734 5ustar eveneven././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/QI_DATA/S2A_OPER_PVI_L1C_T32TRQ.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* WWBCDES././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000775000175000017500000000000014020414072027734 5ustar eveneven././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B06.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B01.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B05.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B02.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B04.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B10.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B11.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B8A.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B07.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B12.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B09.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B03.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B08.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000067614020414072027747 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/S2A_OPER_MTD_L1C_T32TRQ.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000664000175000017500000000775514020414370027755 0ustar eveneven S2A_OPER_MSI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ_N01.03 S2A_OPER_MSI_L1C_DS_MTI__20151231T235959_S20151231T235959_N01.03 NOMINAL 2015-12-31T23:59:59.999Z MTI_ 2015-12-31T23:59:59.999Z WGS84 / UTM zone 32N EPSG:32632 10980 10980 5490 5490 1830 1830 800000 5000060 10 -10 800000 5000060 20 -20 800000 5000060 60 -60 5000 5000 5000 5000 26 135 5000 5000 5000 5000 9 104 0 0 S2A_OPER_MSK_DEFECT_MTI__20151231T235959_A000123_T32TRQ_B01_MSIL1C.gml S2A_OPER_PVI_L1C_TL_MTI__20151231T235959_A000123_T32TRQ gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml0000664000175000017500000002307714020414370030103 0ustar eveneven 2015-12-31T23:59:59.999Z 2015-12-31T23:59:59.999Z Level-1C S2MSI1C 01.03 2015-12-31T23:59:59.999Z http://example.com BrowseImageFootprint Sentinel-2A INS-NOBS 2015-12-31T23:59:59.999Z 22 DESCENDING -90.0 -180.0 90.0 180.0 false false B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B8A Brief YES YES SAFE false S2A_OPER_MSI_L1C_T32TQR_B01 S2A_OPER_MSI_L1C_T32TQR_B06 S2A_OPER_MSI_L1C_T32TQR_B10 S2A_OPER_MSI_L1C_T32TQR_B08 S2A_OPER_MSI_L1C_T32TQR_B07 S2A_OPER_MSI_L1C_T32TQR_B09 S2A_OPER_MSI_L1C_T32TQR_B05 S2A_OPER_MSI_L1C_T32TQR_B12 S2A_OPER_MSI_L1C_T32TQR_B11 S2A_OPER_MSI_L1C_T32TQR_B04 S2A_OPER_MSI_L1C_T32TQR_B03 S2A_OPER_MSI_L1C_T32TQR_B02 S2A_OPER_MSI_L1C_T32TQR_B8A S2A_OPER_MSI_L1C_T32TRQ_B01 S2A_OPER_MSI_L1C_T32TRQ_B06 S2A_OPER_MSI_L1C_T32TRQ_B10 S2A_OPER_MSI_L1C_T32TRQ_B08 S2A_OPER_MSI_L1C_T32TRQ_B07 S2A_OPER_MSI_L1C_T32TRQ_B09 S2A_OPER_MSI_L1C_T32TRQ_B05 S2A_OPER_MSI_L1C_T32TRQ_B12 S2A_OPER_MSI_L1C_T32TRQ_B11 S2A_OPER_MSI_L1C_T32TRQ_B04 S2A_OPER_MSI_L1C_T32TRQ_B03 S2A_OPER_MSI_L1C_T32TRQ_B02 S2A_OPER_MSI_L1C_T32TRQ_B8A NODATA 1 SATURATED 0 3 2 1 1000 0.97 1900 1900 1800 1500 1400 1200 1100 1000 900 800 300 200 80 4 3 3 4 5 4 4 6 5 8 61 37 0 46 11 45 11 45 13 46 13 46 11 POINT 1 EPSG GEOGRAPHIC S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 S2__OPER_DEM_GLOBEF_PDMC_19800101T000000_S19800101T000000 S2__OPER_AUX_UT1UTC_PDMC_20151001T000000_V20151002T000000_20161001T000000 S2A_OPER_AUX_GRI065_PDMC_20130621T120000_S20130101T000000 S2__OPER_AUX_ECMWFD_FAKE_19800101T000000_V19800101T000000_19800101T000000 0.0 0 0 PASSED PASSED PASSED PASSED PASSED gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/0000775000175000017500000000000014020414072020773 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/0000775000175000017500000000000014020414370024450 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/S2A_USER_MTD_SAFL2A.xml0000664000175000017500000003375114020414370030122 0ustar eveneven 2015-12-31T23:59:59.999Z 2015-12-31T23:59:59.999Z Level-2Ap S2MSI2Ap 01.03 2015-12-31T23:59:59.999Z http://example.com BrowseImageFootprint Sentinel-2A INS-NOBS 2015-12-31T23:59:59.999Z 22 DESCENDING -90.0 -180.0 90.0 180.0 false false B1 B2 B3 B4 B5 B6 B7 B9 B10 B11 B12 B8A Brief YES YES SAFE false S2A_USER_MSI_L2A_T32TQR_B01_60m S2A_USER_MSI_L2A_T32TQR_B02_60m S2A_USER_MSI_L2A_T32TQR_B03_60m S2A_USER_MSI_L2A_T32TQR_B04_60m S2A_USER_MSI_L2A_T32TQR_B05_60m S2A_USER_MSI_L2A_T32TQR_B06_60m S2A_USER_MSI_L2A_T32TQR_B07_60m S2A_USER_MSI_L2A_T32TQR_B8A_60m S2A_USER_MSI_L2A_T32TQR_B09_60m S2A_USER_MSI_L2A_T32TQR_B10_60m S2A_USER_MSI_L2A_T32TQR_B11_60m S2A_USER_MSI_L2A_T32TQR_B12_60m S2A_USER_SCL_L2A_T32TQR_60m S2A_USER_SNW_L2A_T32TQR_60m S2A_USER_CLD_L2A_T32TQR_60m S2A_USER_AOT_L2A_T32TQR_60m S2A_USER_WVP_L2A_T32TQR_60m NODATA 1 SATURATED 0 3 2 1 1000 1000 1000.0 1000.0 0.97 1900 1900 1800 1500 1400 1200 1100 1000 900 800 300 200 80 4 0 SC_NODATA 0 SC_SATURATED_DEFECTIVE 1 SC_DARK_FEATURE_SHADOW 2 SC_CLOUD_SHADOW 3 SC_VEGETATION 4 SC_BARE_SOIL_DESERT 5 SC_WATER 6 SC_CLOUD_LOW_PROBA 7 SC_CLOUD_MEDIUM_PROBA 8 SC_CLOUD_HIGH_PROBA 9 SC_THIN_CIRRUS 10 SC_SNOW_ICE 11 46 11 45 11 45 13 46 13 46 11 POINT 1 EPSG GEOGRAPHIC S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 S2__USER_DEM_GLOBEF_PDMC_19800101T000000_S19800101T000000 S2__USER_AUX_UT1UTC_PDMC_20151001T000000_V20151002T000000_20161001T000000 S2A_USER_AUX_GRI065_PDMC_20130621T120000_S20130101T000000 S2__USER_AUX_ECMWFD_FAKE_19800101T000000_V19800101T000000_19800101T000000 S2A_USER_GIP_L2A_TL_MTI__20151231T235959_A000123_T32TQR http://xxxx xxxx.atm xxxx.tiff 0.0 0 0 PASSED PASSED PASSED PASSED PASSED 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/0000775000175000017500000000000014020414072025544 5ustar eveneven././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000775000175000017500000000000014020414370027756 5ustar eveneven././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/S2A_USER_MTD_L2A_T32TQR.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000001242614020414370027765 0ustar eveneven S2A_USER_MSI_L2A_TL_MTI__20151231T235959_A000123_T32TQR_N01.03 S2A_USER_MSI_L2A_DS_MTI__20151231T235959_S20151231T235959_N01.03 NOMINAL 2015-12-31T23:59:59.999Z MTI_ 2015-12-31T23:59:59.999Z WGS84 / UTM zone 32N EPSG:32632 10980 10980 5490 5490 1830 1830 699960 5100060 10 -10 699960 5100060 20 -20 699960 5100060 60 -60 5000 5000 5000 5000 26 135 5000 5000 5000 5000 9 104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 S2A_USER_MSK_DEFECT_MTI__20151231T235959_A000123_T32TQR_B01_MSIL1C.gml S2A_USER_CLD_L2A_TL_MTI__20151231T235959_A000123_T32TQR S2A_USER_SNW_L2A_TL_MTI__20151231T235959_A000123_T32TQR S2A_USER_PVI_L2A_TL_MTI__20151231T235959_A000123_T32TQR ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000775000175000017500000000000014020414072027755 5ustar eveneven././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/S2A_USER_PVI_L2A_T32TQR.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* WWBCD$E$*S././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/S2A_USER_SNW_L2A_T32TQR_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/S2A_USER_CLD_L2A_T32TQR_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000775000175000017500000000000014020414072027755 5ustar eveneven././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/S2A_USER_SCL_L2A_T32TQR_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000775000175000017500000000000014020414072027755 5ustar eveneven././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B10_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B8A_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B06_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B01_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B03_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B02_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_AOT_L2A_T32TQR_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_WVP_L2A_T32TQR_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B04_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* ** BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B07_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B09_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B11_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B05_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/S2A_USER_MSI_L2A_T32TQR_B12_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000664000175000017500000000067614020414072027770 0ustar evenevenII* rr BCD$E$*Sgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/0000775000175000017500000000000014020414072022002 5ustar eveneven././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414370027053 5ustar eveneven././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000003473014020414370027064 0ustar eveneven 2018-08-18T09:40:31.024Z 2018-08-18T09:40:31.024Z S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE Level-2A S2MSI2A 02.08 2018-08-18T12:03:45.000000Z Not applicable Not applicable Sentinel-2A INS-NOBS 2018-08-18T09:40:31.024Z 36 DESCENDING SAFE_COMPACT GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B02_10m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B03_10m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B04_10m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B08_10m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_TCI_10m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_AOT_10m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_WVP_10m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B02_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B03_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B04_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B05_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B06_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B07_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B8A_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B11_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B12_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_TCI_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_AOT_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_WVP_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_SCL_20m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B01_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B02_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B03_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B04_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B05_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B06_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B07_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B8A_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B09_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B11_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B12_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_TCI_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_AOT_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_WVP_60m GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_SCL_60m NODATA 0 SATURATED 6 3 2 1 10000 1000.0 1000.0 0.97 1884.69 1959.72 1823.24 1512.06 1424.64 1287.61 1162.08 1041.63 955.32 812.92 367.15 245.59 85.25 SC_NODATA 0 SC_SATURATED_DEFECTIVE 1 SC_DARK_FEATURE_SHADOW 2 SC_CLOUD_SHADOW 3 SC_VEGETATION 4 SC_NOT_VEGETATED 5 SC_WATER 6 SC_UNCLASSIFIED 7 SC_CLOUD_MEDIUM_PROBA 8 SC_CLOUD_HIGH_PROBA 9 SC_THIN_CIRRUS 10 SC_SNOW_ICE 11 57.7 22.6 57.6 24.5 56.7 24.4 56.7 22.6 57.7 22.6 POINT 1 EPSG GEOGRAPHIC 54.4 0.0 0 PASSED PASSED PASSED PASSED PASSED 0.0 0.0 1.5 1.5 14.0 3.5 18.7 5.7 24.1 15.3 14.9 0.4 0.0 0.0 0.0 ././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414072027052 5ustar eveneven././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414370027053 5ustar eveneven././@LongLink0000644000000000000000000000026100000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/QI_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414072027052 5ustar eveneven././@LongLink0000644000000000000000000000030300000000000011577 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/QI_DATA/MSK_SNWPRB_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000030300000000000011577 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/QI_DATA/MSK_CLDPRB_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000030300000000000011577 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/QI_DATA/MSK_SNWPRB_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000030300000000000011577 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/QI_DATA/MSK_CLDPRB_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414072027052 5ustar eveneven././@LongLink0000644000000000000000000000026700000000000011610 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414072027052 5ustar eveneven././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B03_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B06_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_SCL_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B8A_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B05_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B04_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_TCI_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B11_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_AOT_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_WVP_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B01_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B07_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B02_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B12_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B09_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000026700000000000011610 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414072027052 5ustar eveneven././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B02_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B04_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B03_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B05_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B07_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_AOT_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B11_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B06_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B12_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B8A_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_TCI_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_SCL_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_WVP_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000026700000000000011610 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000775000175000017500000000000014020414072027052 5ustar eveneven././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_AOT_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B02_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_TCI_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_WVP_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B04_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B03_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B08_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000067614020414072027065 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/MTD_TL.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000664000175000017500000000664614020414370027071 0ustar eveneven S2A_OPER_MSI_L1C_TL_MTI__20180818T101348_A016478_T34VFJ_N02.06 S2A_OPER_MSI_L2A_TL_MTI__20180818T120345_A016478_T34VFJ_N02.08 S2A_OPER_MSI_L2A_DS_MTI__20180818T120345_S20180818T094030_N02.08 NOMINAL 2018-08-18T09:40:30.459Z MTI_ 2018-08-18T15:07:55.560Z WGS84 / UTM zone 34N EPSG:32634 10980 10980 5490 5490 1830 1830 600000 6400020 10 -10 600000 6400020 20 -20 600000 6400020 60 -60 54.416476 0 0.000000 0.000000 1.566982 1.521106 14.057219 3.544726 18.739088 5.750781 24.111301 15.382876 14.922300 0.403622 0.0 0.0 0.0 gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/0000775000175000017500000000000014020414072022162 5ustar eveneven././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414370027137 5ustar eveneven././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000004215614020414370027151 0ustar eveneven 2017-08-23T09:40:31.026Z 2017-08-23T09:40:31.026Z S2A_MSIL1C_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE Level-2Ap S2MSI2Ap 02.05 2017-08-25T08:50:10Z Not applicable Not applicable Sentinel-2A INS-NOBS 2017-08-23T09:40:31.026Z 36 DESCENDING SAFE_COMPACT GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B01_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B02_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B03_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B04_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B05_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B06_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B07_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B8A_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B09_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B11_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B12_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/AUX_DATA/L2A_T34VFJ_20170823T094031_DEM_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_SCL_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/L2A_T34VFJ_20170823T094031_SNW_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/L2A_T34VFJ_20170823T094031_CLD_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_AOT_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_WVP_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_TCI_60m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B02_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B03_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B04_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B05_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B06_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B07_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B8A_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B11_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B12_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/AUX_DATA/L2A_T34VFJ_20170823T094031_DEM_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_SCL_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/L2A_T34VFJ_20170823T094031_SNW_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/L2A_T34VFJ_20170823T094031_CLD_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_AOT_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_WVP_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_TCI_20m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B02_10m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B03_10m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B04_10m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B08_10m GRANULE/L2A_T34VFJ_A011330_20170823T094252/AUX_DATA/L2A_T34VFJ_20170823T094031_DEM_10m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_AOT_10m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_WVP_10m GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_TCI_10m NODATA 0 SATURATED 6 3 2 1 10000 10000 1000.0 1000.0 0.97 1913.57 1941.63 1822.61 1512.79 1425.56 1288.32 1163.19 1036.39 955.19 813.04 367.15 245.59 85.25 4.05258688 3.79421934 4.19056789 4.516256 5.19904998 4.86711284 4.52865796 6.19052531 5.13233152 8.52613546 55.22178219 35.32963486 106.39533241 0 SC_NODATA 0 SC_SATURATED_DEFECTIVE 1 SC_DARK_FEATURE_SHADOW 2 SC_CLOUD_SHADOW 3 SC_VEGETATION 4 SC_BARE_SOIL_DESERT 5 SC_WATER 6 SC_CLOUD_LOW_PROBA 7 SC_CLOUD_MEDIUM_PROBA 8 SC_CLOUD_HIGH_PROBA 9 SC_THIN_CIRRUS 10 SC_SNOW_ICE 11 57.7 22.6 57.6 24.5 56.7 24.4 56.7 22.6 57.7 22.6 POINT 1 EPSG GEOGRAPHIC L2A_T34VFJ_A011330_20170823T094252 L2A_T34VFJ_A011330_20170823T094252 L2A_T34VFJ_A011330_20170823T094252 http://data_public:GDdci@data.cgiar-csi.org/srtm/tiles/GeoTIFF/ GlobalSnowMap.tiff 86.3 0 0 PASSED PASSED PASSED PASSED PASSED 0.0 0.0 1.0 4.1 5.0 0.4 2.9 1.6 28.9 36.1 19.3 84.4 0.2 0.0 0.0 0.0 ././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414072027136 5ustar eveneven././@LongLink0000644000000000000000000000025200000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414370027137 5ustar eveneven././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414072027136 5ustar eveneven././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/MSK_SNWPRB_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/MSK_CLDPRB_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/MSK_SNWPRB_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000030400000000000011600 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/QI_DATA/MSK_CLDPRB_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414072027136 5ustar eveneven././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414072027136 5ustar eveneven././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_AOT_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B06_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_TCI_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B04_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B09_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_SCL_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B03_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B8A_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B01_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B02_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B05_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B11_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B07_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_B12_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/L2A_T34VFJ_20170823T094031_WVP_60m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414072027136 5ustar eveneven././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_VIS_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B12_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B11_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B05_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_AOT_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B03_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_TCI_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B8A_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_WVP_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B06_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B04_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_SCL_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B07_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/L2A_T34VFJ_20170823T094031_B02_20m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000775000175000017500000000000014020414072027136 5ustar eveneven././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_TCI_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_AOT_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B04_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_WVP_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B03_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B08_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/L2A_T34VFJ_20170823T094031_B02_10m.jp2gdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000067614020414072027151 0ustar evenevenII* && BCD$E$*S././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/MTD_TL.xmlgdalautotest-3.2.2/gdrivers/data/sentinel2/fake_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000664000175000017500000000732514020414370027150 0ustar eveneven S2A_USER_MSI_L2A_TL_SGS__20170823T133142_A011330_T34VFJ_N02.05 S2A_USER_MSI_L2A_DS_SGS__20170823T133142_S20170823T094252_N02.05 NOMINAL 2017-08-23T09:42:52.161Z SGS_ 2017-08-23T14:08:32.325838Z WGS84 / UTM zone 34N EPSG:32634 10980 10980 5490 5490 1830 1830 600000 6400020 10 -10 600000 6400020 20 -20 600000 6400020 60 -60 86.3421 0 0.000000 0.000000 1.058892 4.194147 5.036503 0.448578 2.938666 1.662363 28.919381 36.154309 19.373934 84.447624 0.213228 0.0 0.0 0.0 L2A_T34VFJ_20170823T094031_CLD L2A_T34VFJ_20170823T094031_SNW L2A_T34VFJ_20170823T094031_PVI gdalautotest-3.2.2/gdrivers/data/leveller/0000775000175000017500000000000014020414072017236 5ustar evenevengdalautotest-3.2.2/gdrivers/data/leveller/ter6test.ter0000664000175000017500000006746614020414072021555 0ustar eveneventrrnflightPrefs_vellinear?flightPrefs_velrot?flightPrefs_velautoflightPrefs_inertiapostflight_drawafterpostflight_waitbeforedrawingpostflight_waittime?postflight_style_drawsomepostflight_style_drawbboxpostflight_style_cullbackfacespostflight_style_subgridsize@postflight_style_stepxpostflight_style_stepzpostflight_style_alodpostflight_style_backplane postflight_style_fogpostflight_style_fog_crgb postflight_style_fovHBpostflight_style_drawsolid postflight_style_wireframe_style!postflight_style_wireframe_useHSRpostflight_style_wireframe_clrpostflight_style_solid_smoothpostflight_style_solid_shadingpostflight_style_solid_shadows!postflight_style_solid_shadowtint?flightRS_drawsomeflightRS_drawbboxflightRS_cullbackfacesflightRS_subgridsize@flightRS_stepxflightRS_stepz flightRS_alodflightRS_backplane flightRS_fogflightRS_fog_crgb flightRS_fovHBflightRS_drawsolidflightRS_wireframe_styleflightRS_wireframe_useHSRflightRS_wireframe_clrflightRS_solid_smoothflightRS_solid_shadingflightRS_solid_shadowsflightRS_solid_shadowtint?editRS_drawsomeeditRS_drawbboxeditRS_cullbackfaceseditRS_subgridsize@ editRS_stepx editRS_stepz editRS_alodeditRS_backplane editRS_fogeditRS_fog_crgb editRS_fovHBeditRS_drawsolideditRS_wireframe_styleeditRS_wireframe_useHSReditRS_wireframe_clreditRS_solid_smootheditRS_solid_shadingeditRS_solid_shadowseditRS_solid_shadowtint?vps_P0 vps_O0$vps_P1 vps_O1$vps_P2 vps_O2$vps_P3 vps_O3$ rts_skyshape rts_skyradzD rts_skypos HB rts_skyang rts_maxtrc rts_skypuvscB rts_pmoderts_ozHBrts_hfnormcomprts_hfnormsmooth rts_shadowsrts_arealightrad@rts_arealightgridrts_shaders_bname0lrts_shaders_cname0lrts_shaders_bname1lrts_shaders_cname1lrts_shaders_bname2lrts_shaders_cname2lrts_shaders_bname3lrts_shaders_cname3l rts_mask0_userts_mask0_usedocrts_mask0_invertrts_mask0_filel rts_mask1_userts_mask1_usedocrts_mask1_invertrts_mask1_filel rts_mask2_userts_mask2_usedocrts_mask2_invertrts_mask2_filel rts_mask3_userts_mask3_usedocrts_mask3_invertrts_mask3_fileldrs_fldrs_wdrs_hdrs_budrs_partdrs_y1drs_y2drs_mindrs_hdri drs_fhdril grid_spcX A grid_spcZ A grid_spcugrid_oxgrid_oz grid_mdspc markers_l selfo_method selfo_elevselfo_elevunits sago_active sago_minaltsago_elevunits hfsel_reldf info_titlel info_authorlinfo_copyrightl info_notelhf_typehf_cr_lhf_cr_thf_cr_r?hf_cr_b_ hf_elevmin hf_elevmaxE hf_eelevmin hf_eelevmaxEhf_worldspacing$@hf_worldspacinglabell hf_worldspacinglabeld ft (foot)hf_w@hf_b`hf_data`l@@1@>@^@<@@N>@@3@ް@@O@@q@@],@9@̴@x@ @@@T@4@@Vs@|{V@E@5@@@T@@ 1 @/~ @V @U @%@'+@*=@zKH@N@85e@Ow@@@H@ ׬@P@ @@@{@@^@t@gAA"AP A. Ah AFA@)@@@@-@0E@U@A@2@jO@m@-@@V@@@K@i@%@@?@@4Ƥ@P@ؐ@[@a@?@1@&@?@P @ @4@T@# @@W@@f^ @5@_H@5 ^@/l@g}v@>@@lB@h.@b@ @Wn@(@b@ @@ @2@HALAAtAAAK Ar@@ռ@<@a@@"@@ @c@@@@@@^@@;@U@y@;@ƨ@T@5a@G@p@TeK@3@!@{H@@@P @@? ?8?}?H @!@}7@~L@a@!q@Y|@@t@@j@@hq@`@"C@@ @{m@C @n0@TA}AAA AݜA@]'@C@@@-@\@w@7@@@G@@D'@'@(@@F@,@8߸@@,@K֗@Š@'>~@^V@Z5@ @4@@n@mw?5????_???@*@G@R@i@6z@<@:@b@@>@@Ķ@@o@L@ZY@G@@@AA@=Q@@֩@@@N@&@^@`!@@@@*@l@kO@@&@Q@@@W@Ŵ@@@[[@[@ yn@I@ '@@?@B?4?{??T{?A?y???V?-` @j&@5 >@kR@Fb@t@Ɇ@\ɐ@@#@柹@Mt@@"@@&@d@@X@\ @A@d@@@@@@@8@>@@4D@B@K@G@5C@׿@U@@*@gh@\G@-2@@>@(#@@@Ϲ@A@@Uj@;@ @X@9??i?w?Ϳ?9:??5:?D???h[@m@¡1@P@}}f@v@Dۈ@Ͻ@3@#_@Ȼ@;@t@@|@~A@E@#@ 6@*m@)A2AAi@l@(K@W@֠@@r@I@ؘ@@@V@ߛ@X@@@lR@A@*@N@x@@ש@̛@W@҈@d@4@J@?!?l?A??:?0?5? ?Q?V̾?+?2@@R,@>6D@FQ^@yXp@E@@@[®@@W@Jv@$@@b@@>@v@vAX1AAA+AhA@<1@@@Y@_@k@@@v@M@@5@:@'@P2@"@@>E@R@K@@2@@}@*}@8T@)@ @,A?ֱ?\?.~???>_???6?{??a@@ 7@)@sF@dzb@Bf@B@@@*@P@@?@*@@N@ @T5@V@AAnaA0AAԲ@@Vj@@T@?@A@$@@ASAC@5@x@@^@&@8y@~@,@3@X@@e@EF@K&!@ @ M?m?ӭ?PN?]??ڣ?Y?MU?὾?O?Oc??p ?aL @\@V .@8M@q@@t@XF@v@n@/@@S@0@ @nQ@.Z@V@}@ATAA A@@s@'@l@@ @d@zAVAZAMFA@@1@@@ @@s@=@@W@c@A@ˮ(@]@??+??+?h?Y?ə??r?L ?U?D@@@@$@7@ہX@@x@Y@[#@@Ҭ@@A@ K@w@J@>@~@Ґ@@`A(%AfAmAn@@@@Z@݆@(@b@ʉAAAA@@@@@:@@Һ@t@V@ @\m@;$G@s"@D@I@"??-N?c?J?Lg?#?P? ?zW?B?@@h@x@=_%@o<@G@v]@Xr@3@@%@{@@@-@C@ g@@:y@ @]mA{AZA A(@@@R@Dx@F#@Ŀ@,BAoAE5AA-@ޫ@[@(n@o@4@Z@@G@/ɬ@w@p@K{@FW@ 6@z@Q`@o@:??Ρ??ŭ?>?HW????uj @@x@B@F&@d<@C@T/Z@0o@.}@@@e@@O@ο@gx@?@IN@ʈ@@r@@AAw@Tk@@@:@@1R@X_Aa#AA A @%@A@I@@-@,@@Ļ@8@Q@薍@|@8d@@@η$@T@@C@ @,??.߿?N??xe?G??-n@GC@@{@R @ہ'@Ʈ;@M@V]@j@%i@c@ @sn@b@@[@J@ @,P@@Z@pp@@DZAA`@@@@@rz@p@^wA|A@@d@Tp@@@)@,@@@ @Zֳ@4@}Ր@~@ch@P@w/@@@B@h @S??U?H?[?T??+@@>"@G"@L'@N/@iB@K@XS@_@f@+o@@@7t@Ʈ@@@ 4@x@{@@@b@Y@AA@@@ @t@FI@@K@@r@@D@q=@q=@q=@q=@q=@q=@r@ښ@b@ӥ@f@Œ@C{@ X@4@&@%@@@ @U?!O?P?5?\?+6?2r@3T@h @B@&@.@-=@& C@gK@p{T@T_@nfg@qr@X@@ũ@V|@@T@@ @Ԕ@o@H@@G@å@#@9@Z@f@@ @@,@8AA@D@q=@q=@q=@q=@o@@V@@j@ @Y@u@d@9L@ym?@84@*&@S@Vi @@?E*????@8A@ @4@$@n-@*4@@@x6J@ P@JX@[@;m@"@E@²@6@R@@d@j@@@>@@<A@a@6J@a@J@@@@w@ߗASA A@q=@q=@q=@q=@T@@@4@T@D@*D@mv@:x@{+f@fV@@@*@“@@?k?#?u.?d??V?x @@ @u*@R)2@G8@׍A@I@fR@8[@m@~@"@Q@SA@f7@` @@@D@*@@He@ @7Av@@Y@=d@@@Fr@`@@*@AA,A7@q=@q=@q=@q=@P@C@j@M@D@@g@^@oO@~.z@c@N@@>@ +@+@?l?? ]?*s?5?C@\O @ @7@~6@G@ iP@wX@c@m@vr@ @̈́@a@(@ǟ@@|@L@c@@@@js@$?@7A˥@Mj@@=@7&@M@@@@)@LAABAh@q=@q=@q=@q=@L@@ @S@m@7ط@\@o@K@ŀ@<]@O@E@P,@@?u'???\??+> @N@B^@*@l=@P@^@De@(Zr@|@nA@\ @D@|B@@D@@!@r @Y@3@@@7@l@"@#@@H@4L@d@B@<@@5@T@D@MAϡ@q=@q=@q=@q=@=@@@J@@4@U@f@ @@^g@W@(H@5@0@@V???V=?s{?{_@Y@0@(@$|<@Z@Th@lp@|@ތ@ @&ލ@z|@̊@WQ@@$@@zT@ @$@@@3@@@J@p@s@&L@@@~@@t@@R@Y5@@q=@q=@q=@q=@W@@i@;@H@cp@w@@Jݖ@@ @_i@G@FB,@'@@n @G?T?? ?E@k@@p@C3@eT@2go@:{@T{@@<@Z@/U@(k@Ҍ@B@Pr@M~@r6@pM@@J@.@n@@@|@h@8[@*@3Y@F@@@@@@6@I@q=@q=@q=@q=@6@A0@@*@jY@ƺ@yl@@@+@d@SW@\.@8`"@@@@?<?>'?@@E@$@6@V@r@z@ @@A@^@@%@@ޛ@Ah@@@E@@E@@M@@@@0@=]@Ƥ@ͯ@H@1@¥@3J@}@P@i@@Д@q=@q=@q=@q=@@AWZ@j@*@n@:@^k@@ @2@O@f@جE@<+@@8@R@f?h/??^?Td @@*@8;@-V@-m@Ni}@Z\@jD@e@@@kߦ@!@G@o@ @t@ 2@ @@@Ļ@@ @@jx@@@c@@}@@@@_@@B@iL@q=@q=@q=@q=@K@AUA@j@wx@1@Sھ@@y@gҖ@I@$v@ U@Jc9@G'@9@@E@@X{ @0@@u@'@*7@֡O@8m@_@E@t?@"@ @,@@"@@l@7@@*@B@Q@PT@U@/Q@C@@1@=@@@Þ@@@8]@C@@3@@5@q=@q=@q=@q=@l@ AA@*@@J@@Z@@G@G@@W@2>@M,@+!@!@<|@@@C@qV@@g*@?@tT@,yq@z@T@`@ .@@B@@ꚪ@U@@@&!@@@@~@B@gN@D@Ճ@8@%@ @$@b@%@?@u̲@Lʺ@z@,^@H@q=@q=@q=@q=@@Ao@v@2-@@&.@M>@\x@b@/@@,@Gt`@L@8@4-@}-@ @ @\@{ @@dI@1@G@GX@v@} @(G@b@ˡ@h@@Wn@~Y@@@K@BZ@|@~@@@@@@,Kp@xN@u@H@k@뉔@;@@ U@k3@E@X@S@q=@q=@q=@q=@ @nAr@Z@c@E@$U@q@k@@;@9E@BՆ@&j@A@4@I5@X,@)(@"@@Z:@W@\"@4@MI@Vf@,|@@{@E@p5@8@l@@0@@@@V|@=@x@p@/}@@<@֝@'a@tp@D3z@-Q@ʇ@L@K_@)@Ư@p@:Y@N@4]@q=@q=@q=@q=@@'A[@7|@2@@ʓ@&@:C@Œ@@Bw@zU@!c@L'8@3*@2@t1@A.@-@)@&@"%@>.@[9@Q@qx@f@(@e@St@>@C@V@j@@nH@$@@@+@?@@,@@@V>@mQ@tg@!;j@q@Jw@e@#-@hޗ@@@@@&@q=@q=@q=@q=@@:@Y@8@@/@@@}@I(@*I@9@e@ef@֢;@d%@31@A3@0@ 1@.(@.@3@"8@fG@{c@^y@S@@_@^ @^@v@E@t@o@@lT@2@@@@ 5@@\@@@U@23@P@{R@ U@*j@݄@͉@w@% @U@@`!@@q=@q=@q=@q=@Ծ@XS@z)@C@?@&@hB@@3@>@o@q=@*y@d@;@"@ %@x,@ %@J3@_/@Ek3@?@H8D@L@g@{@梇@$@C@d@\@ݾ@@`@.@no@@6@J@@@h@$@@d`@mA0J@?`1@3@;:@Xb@@@}@ӭ@@]ƹ@W@vT@q=@q=@q=@q=@a,@!@Dt@P@8@R@r@@@Ш@@q=@p@W@ 4@  @"@l@@&@U1@7@HB@V@Y^@v@1@U@ @@#@D@@d@@e@o"@@A@h@(@a@H@He@k@~A:RAG@v@B@H5@W@X@A@H@:@rV@?@b@ @q=@q=@q=@q=@H@&@z@1@Z@]@w@@n@%@q=@Վ@h@l.K@U(@@@{ @֏@|f(@+@3@iK@=`@o@:@|@)@o@@Wa@6Բ@L@@@ʔ@j@L@ l@Z@L@}@(&@`@l%AANA,E@"!@Je*@J@Dj@@`@ŝ@¬@`@s@.x@@@q=@q=@q=@q=@=˹@,@p@@@@մ@@t@^@q=@]@Bg^@QM@H-@@@i@K@)-@4@1@D@@X@v@ȍ@@@㫢@@q@/@@ž@)@D@֎@@G@AAAAA$xA$AA @H'@Ķ>@Y@u@`d@@Т@^@f@R@N@@q=@q=@q=@q=@q=@@g@!@w@("@ϸ@@q=@q=@q=@ɣ@#f@/cL@5@@Z@ @x@!@"-@,@P`;@{R@ c@T@l0@$@=@@@v@O@@vs@T@k@@*@!AGAAeVAIAAAgA@5@S@?q@t܅@@@ә@y@r@n@x@@@q=@q=@q=@q=@q=@q=@q=@q=@q=@q=@q=@q=@q=@q=@q=@-.@^{@Z@E@G)@CF@@:@@b!@*(@_!6@kN@`^@}@sc@^@ר@8@VU@V@TW@@#@@ʵ@@DAANAnAA5AMA\pA!A;-@QF@ja@e@@м@}@y@x@:@ɻ@@@@zC@K@Lm@@"k@@O@~^@F@!@@)d@@@#@H@raf@^I@6@)@i@2@?Y@@-@7@bH@vh@@@N@$@.8@t9@@Gø@`@R@@@@:AAA'A AAMAYaAA*D@Z@Xv@@J@@@C@(@.l@o@J@@^@@n@L@~@~@@R@T@{@@@?@sg@@N@oz@bYg@n+W@F@h";@^3,@ %@(@g+@d;@kC@6N@&-n@iA@@i @֞@j@{@B@ n@`I@@ @v@(@ AA2AmAP=ANA^AdrAAN@a@^p~@@m~@@V@@p@@oJ@@k@+@L@@v@0@@p@b@y@@(@wB@ղ@@(ƍ@w@ep@Bpw@O\p@`@`0U@&D@z.5@7@9=@4I@S@a@ v@<Ë@@@擛@z@G@}~@Vܲ@q[@@@G@@@@@A-AkA<A6uAdlA AbQ@+T@gf@ogw@@{@Oј@@@ۜ@f@(@@1@“@6@x@@=@ڹ@@b@p~@@Kbb@(i@.y@ja@E@@@[@Ե@(^@-@y.@@η@ҟ@@$*@Ϋ@/@-@m@'@_@(@O@@c@@v@@ @@@Ln@?^@dZ@D$g@``@g@uy@x@%ɓ@@5s@@6@|@J@-@.@@%@@t2@Y@o@w@@HAXAU@b@C@@.f@!v@x@߁@܃@^R@K@)~@O@Z@@r@)@6@2J@K@3@֚@f@@]@@n@Ӌ@/@ʡ@@^k@E@@,Lj@@@8v@yo@(ph@Wq@vp@N@~v@[@.@ @C@W@@Ϯ@@<@+ƽ@[@޾@@N@@*@oe@U@F@ @zR@f}@n @@#Em@}@~@`@l@@@ʭ@@v@w@t@ @@v\@:@L@i@f@ܽ@ٺ@NV@GL@ @@N@@h֝@j@x4@@@B@V@Z@z@@*q@@b@@@$@jV@*-@@@}@垸@?@W@s@}@@@T@w@@@p@}@@@X@~@?@@o6@6@;@@@.@.@}@@Bz@D@@@C@x@@@Fl@h@y@X@N@ޟ@@@@i@o]@k@@g@B@č@P@\@@T@ݵ@@FԦ@s&@@Բ@ˠ@)@/@&@ @o@@@@@@*@@Y@RI@@@@@}Ë@Vs@u@@О@a2@W[@BS@@h@ר@=@@C@@@9~@%@@C@^A@X@V@(@ @h@0@r@@@@b֗@BB@!@]D@@t@@֗@@@yݭ@ڈ@X@{@c@@ҫ@@#@$@Z3@:a@N@@"{@@f@@+@ޚ@C.@į@@)@[W@@+@F@i@@R@@@Vo@@v6@f @z@@@@@@$@@@a@SD@<@5@@@ɤ@舤@1 @:@(á@@(Ü@u@@H@^O@@xT@@ޥ@ã@@]@.]@&@dI@V@@U@\@W@&@u@@k%@O@2@@@́@$@%@a@8@d@@ @@4@@c@@,@@&@@@@P@R@@\@@@3@޷@쟵@`@@f@;(@*3@@m@b @V@@P?@@Z@$-@LR@fp@@/@@d"@п@9@ @xN@pܵ@ C@[k@m|@h@Ø@(l@ZY@@L@g@@@D@e2@@@p@C@u@`@@-@4@\@A@e@Բ@)*@^@K@@pK@@"@w@w@@_@E@ո@r@U@R۳@@$@N@:@t@ @ߦ@Q>@ǝ@G@@ `@ @@0v@wۗ@֗@z@<Д@F@$@@@CV@b@̼@@S@rĢ@@@+@]@߅@@u@#@@+ܺ@o@@%@}@Y@u|@@6p@@!|@@T)@@oS@H5@ek@a@@@@N@l@V@c@@@Y@@½@÷@+@@G7@)@@@h@\%@@x@s¥@*@,@@K@N@Ü@Ҍ@wb@@/@m@*)@2@u@<@QT@@uۑ@@ ׬@{@b@^@@B\@`@}\@2@@@s@@@:@(@>a@Ԍ@\@G@6@U@Ю@ @(@$@#E@P¾@@@@jκ@#@"@@˵@@C@@@ @R@@=@o@ƣ@v%@@@eޖ@D@sN@V@ת@@6c@@@@.S@J@ @]@w1@n@ @@`)@hu@ @@tT@@v@@8k@ @@@@ha@lE@;'@X?@@@h@g]@@g@@@b%@@vļ@j`@9X@@b@]@N@}+@~@߸@,@@<@@>@@@@N@e@@P@9@*@9@ @Lݘ@O@䓙@2@@K@}@]@@@@@ƕ@ځ@~@<@t@@^@@:@@6@@<@I@վ@:@h޻@H@Ve@|@@@ @{@߼@P@P@@p5@c@{@@@@Qڶ@@@3@%;@@)@@˶@@@D@H@ϑ@o @@y&@0ȕ@@3@@,@S'@=@@@ݘ@#<@%Ҙ@ @@v@ @l@@G%@n@b@)@@Ю@]@@@O@@L@j @mC@E@B@`@7@@p@ @+@6l@@@J@ @ @m6@n@c@@4@@h@k;@@@ @L޵@lܵ@Ш@@@Rv@l@A@@ܓ@d@Y@,x@Z@q@c @@J@ߜ@M@;X@R@H@Bf@ݥ@n@c@c@n3@;@d@*@P@w@@4@@@@%ݲ@ڸ@ Ͷ@$@@ʬ@$@\*@'ܶ@\@I@@̿@F@@=@|@o@T@1m@HI@J@\@<:@K?@U@`@ @I@ @Ѡ@it@\c@9x@Iڞ@@@@Yn@(@ @@M|@.@5ʖ@@@c@\@@t@@@@l@b@@7@>3@.@@Ҿ@;@N,@@ @@#6@@C@2@@-@O@Ħ@V@4"@ʱ@ ^@@T@-@Ƶ@t@9@r@@*@N@@&@4@t@˥@Fc@U@ՙ@@˟@K@m@@r@׹@m@(@#ƣ@G@ @@@.@{"@-@@/@y@@@_@d@`@P@V1@0@(@ @=ϡ@@@ @@a@NŸ@@@@2c@J@a@(0@k'@G@2 @@|@@@@l7@8@@@7@`@k@@@b@@'@P@@N˕@쳜@3@@IJ@@n@@{@Z@Dc@@x@@@@m@@X@?@P@!@@@z@d@m@+@5@݅@ɞ@y֞@@ @K@@i@@n@&3@1@w@ @l@0@y@ @;@@ @J@@^@N@@S@j@@-@.~@ @@!k@\@Q@5@{@_@@!@ݻ@#G@Q@|f@@@A@FT@@@d@؀@J@-@@@W=@5@O@@@@d.@ٮ@.@曡@Nj@@Q@-@@ls@@@a@ @5@@:+@$@@b@,@O@Y@< @t@ne@2@@$@~1@WJ@N@${@1I@p@'@L@v<@b@B6@ة@U@3o@F@@@@P7@:@)@8@5~@G@a@@@@|@@@@*@[@@@۫@C3@p@X@O@p@8 @L@^=@r@8@F@_@L@@mp@G@y@z@@1A[Ah+A@@r@X@,@@J@ɮ@@,@@@@i3@@@y@-H@U@@1`@ _@y@K!@^@@7@@@ @@|n@r@Z@:@@G@0%@W@K@h:@@@P@i@m?@@3@Pʸ@A@|@N@&K@@ڲ@7@@1@[@/@`AAAAAdAj@l~@@Vl@B@8@@@@Y@[5@d)@\ @@ @ɬ@@V0@@@c@@@z@3@@|@ľ@u@P@x@@XC@#@@|@~@+?@w*@@@{@%@%@X@@+@@)@G@@@>>@@@@ )@~@ΣA1AA8AA!AP@@@4@:@@wk@5@@%@4׫@73@r@X@@暯@R@y@ @ C@@2@0@[@@y@@L<@(@@w@@{@ƥ@W7@@@ල@ҵ@0@@v@V@KJ@K@zh@(@x@<@@@! @@@A@A pA*A5KA_ANA'AA&AMFAB@(f@:@@,@dϺ@Џ@4 @%@|.@m@@@x@ @31@-2@5@@bN@@T@R@O@@ȯ@~@:@fù@=x@.@F"@d@@%@@@j@c@w@8@N@f@QL@پ@'O@"@a@a@"@Ѽ@L@@ZAAA;AaAKA>AA.A A]A@@@C@@]@@ @I@J@@g@@أ@h@O@"v@ @s@.@ne@t@3@w@V@ @̹@7?@~@@ @Γ@`µ@@@J@FS@H@a@Y@6@@ի@ު@(@>@ӵ@ @l@+@)@Y@@n@DA!AiA)AAXpA!AAAvAސ AAh[@@@@@@B@@Ѿ@@d@U@q1@@@@"@2@Ma@$@AW@3@J@*@@@K@UX@@z@߃@@Z۲@B@N@@@ ,@@@I9@j(@_K@@ @D@A@TA@G@F@WG@G@7A)AHPAqAgAaAuAf/AdA`fAlA<ATA@8@Q@R@'@D@@r@7@~@W@?@@@R@@pR@@@|@@Ω@@@J!@@"@*R@@\@@@df@ܬ@@U@H@@.\@@@Ů@@ t@s@G@1@ԗ@@@j@8AA8AAA7A'XA`2A~AA&[A2A+A,@G@@I@@@ w@,@d@@ @ޭ@@E@:@Հ@j@@\@@3@^@@@@@@g@50@@Ҝ@d@@@p@b@%@X@L@\ݤ@@!@@@6õ@u@2@;,@<@n@u@nF@@@_A#|A? ATAA'CA(A3AA6AMAA@@@@@$@j@l@Q@#@'@5@z@d@@@+@@J@M@ڼ@|@"@>@@ Z@*@+@@(@#ٚ@@/@ާ@ @@V@<@,@@ĩ@*@j@c@@@F@d@+@ '@ղ@}]@K@5AAA$A tAfAfAAj AA6A-A AXq@'v@O@^@Mq@O@xm@p@p@x@Ć@z@@_@@ b@]@D@Ӹ@@0a@z@@@A@:c@,@/č@Mϐ@ @Vߗ@Đ@@ם@U@S@@4@9@8@GW@F9@)9@@WP@P@@#6@@@x@@@ADADAqKA AI6A Ad A AH A&Q AMA|A6@w@D@PW@~@@d@?@@@J@@W@ @Lu@@O@x@p@L@@@g҈@@@@@g@}@@f@6@@FN@(@@'@@ã@@@#@@@.@@B@@GAm@AA AAAOA A AdAAzA, A@ AT^A*Ar@@1@r@x}@D@<@2@AA"A5A"A@t@@@Ω@@@@ @kD@@ב@@ @k@qa@:ˀ@B@@nS@}@{@DP}@Ņ@@@ӫ@@@&@+@ڂ@;@A~?AAAA%AAAdAO A]4 AAArA|A2A` AT AAA@c@@>@ @֌@-@-AAAۉAtrA@0@u@@\@.@}~@z@|@,@"@;x@@{@fj@7c@^Th@7g@Hi@g@(i_@A"A]MADAz$A0@@M@m@@^AA- A67 Ah ADA&jAA@R@6g~@2s@ m@b@W@b]X@@_ET@o@Ȫ@x@X@@L@6^@@̀@s@?AAYAA+jA]A Ad AntAuA^DAADT A,LAbA AUi A(A&A@@!AZAX@ʱ@p@#AA&Ad A= Aq A0Av A;A; AF@8@!m@W@xH@԰=@h=@ ;@7@3@;@0?@H?@P@M@;=@=C@%]@-@`@@.o@@@D@@0@ۺ@: A]AAwAl2AAkAAoACAUkAAZ A ~AfAjo AhAA%T@$@g@r @VAAA JAQA6A\f A A A AA6AgbAA|A(@f@H@vC5@&@:&@8"@|@ @6&@z3@}=@ P@T@dQ@2S@~kl@.@{@)@Ī@ @@r@K@@@@y0AAAAAJH A;AA3kAA}LABA0V AA AK AA@@PA~@xAAA0vA/AqA% A0 A A A9 A Aʾ AkAAq@U@~?@&*@^@@*D @n@ @s@-@C8@3F@IP@AY@J`@'?x@Ç@怐@Rp@B@ (@r@z@@@ē@5@e2APAA) AA]AAA6AA Ap|AAS A A A{/A@6AŋAaNAqAgA$<AAPWA A" A<- AՕ A AA+AA AA%`]@H@0@l@ @+@@^?v@@ -@4G@GT@ `@gn@x@@̊@ @é@h@1"@@@@G@~@@W2@,@^~A-A3+ A#AC A0AA(A{AAVAAhA KA<A`AOA@pA^xA.X@tAA'-AAAP A AgABA6A؜ AQArAQAz Aw AcRK@b?@ ,@@3 @A @?Y??s@ .@M@ V@Oj@~@2@|@4@@K?@@8@@@z@-@v@@K@,@A}AgA@xtAAA6AUAAڦATAMAdAw@} @9@@/@GAA}7A A AcANAAWAAs^AAAHA.AC@ϼ5@w.&@@@@I??x?@$@OA@U@`@+s@wp@Z@Sy@ @~@@@k@ @@@T@ @ @@Q@O@m@@@AAAuAAAD@b@4@o@ֻ@*@#@\@cIA{pAf A A IAD1AAAAIA$AA6SAA<A:0@As.@V,@b@Rx@& @g@ 9 @@Xc@"@x>@K@JY@f@kq@@s@@B@ݱ@9@y@@@'@@,@@@@@M@@_@@@@@@+7@ l@@t@b@@@4@X@$A ASQAuADAfeArA_ABAA A`AAyA.WA0.@.-#@T@Y@(@@@ @Н@@@+"@ @@I@M@)Z@%:]@u@k@M@N@@խ@|@ @龼@Gù@Ծ@nd@־@|@@w@^@@@@@<^@%@)@@ˌ@>@6a@@(@@ @j@_"@A AAAtAAs,AfAAA!AArAA##Ar3@_-@gE@,}@.@# @[@&@'@%@Y+@2k@@? F@Q@P@V@^o@ @O@i@`{@q@s`@޴@@@@g@@@@^@@@@@%q@ @@?@F@T@Q@@@>@.@п@KN@Ayr A%MAAAAABAA`AAATA.A1Ay3@# >@3@!@˝@w!@a/@5-?@LA@ʘ@@{E@LE@yJ@pV@0c@{;d@Tl@h@T@ߗ@â@@@dz@J@t@Ҽ@]@(@W@*@@A@m@@j@@+@@=@@u@7@b@5@^)@@@@A2 Ah AO A! AX3A$A_ABA3AbAAǍA,A9A,:@9@j!5@5@=5@ܾ9@P@b[@\<[@F[@~[@TnL@$W@V\@rr@{@|@Շ@@uޛ@Х@r@@C+@@e@ja@d@>Z@*@C@@0@@'@O@@.@W@^@`@d@ @>0@z@@Z@@)@YA/A\AA A A' AF6 A A=FA!A$AܳAc:A AC@6;@>P5@@@ID@WG@sLW@Gs@Tq@go@6n@C`@G`@ȃh@|@@e@@@l@@÷@@F@݁@@^Q@V@6@Z@]\@n@S@Ŧ@RԤ@@N@m@k@J@ y@P@@相@@6@+@v@6@BQ@T/@+@)A %A A8AABA AA֒AnAyAAvPA&KD@@@9@D?@G@iD@W@RHp@ k~@\@>@ @y~@̀@>Չ@L@b@4@c@s@<@@K@@'{@?@˩@G@u~@o2@@?@@Ě@ @e@I@f@<@@Q@@G@Ԩ@h@<Ӷ@?@@@@@D2@DA4A A PAA6% AXv AAJ7AdANAxAE{AY:@<@7@k=@C@B@7[@K@J@@:ϋ@@>@|@fx@z@N@ٞ@h@qը@@g@`@Μ@=@П@_@O@@>@D@@\@͔@A@@桠@٠@@6V@ @ߟ@@M@@)@@@XM@@&@UAAh AJ A4~ A< A AAjA2AABlA!Ad7@3@0@4@C6@΃K@Ȟd@^c@ d@@n@M@@Ӭ@А@@Ꙥ@ķ@6@kM@Ć@@B@m@:@ӛ@6@@]@\@B@kΐ@@@\|@.@0@@6@.@@rt@^_@ᦔ@V@@ @z@%@@JI@@$tAAf A, A1 A A( A4AA@AqAA\7@G/@/=+@z@Q(@A@x^@5@s@ H@@ӄ@ϔ@@D@:@@@@ @@@R@e@'@eC@2,@'Ӓ@(@Q@U@ L@\V@&@@˻@'@~@߀@O9y@b@|@@h@G@c@n:@rJ@r @@wQ@a@Gm@@hAA AR A'e A,A?AAWZAcA@RA.s0@k},@H+@j @$@9D@5p@n&@`n@B@Q@Lߛ@@A@3џ@@om@v#@LV@tǝ@Ӡ@@B@՚@'@65@@@҉@^l@φ@@B@u}@nx@v@m@i@g@j@6i@]|m@:t@w@|*@@@P8@11@D<@e@R@r@@BAGAv AT A &AAAAA|mA.@|1@5@|2@ӗ<@_@ @@H@.I@H@Ġ@.G@c@à@Kȩ@Ez@p@s@@R@&@1@ޛ@@z7@!@Z@ل@By@p@k@[h@,j@$i@a@PV@ȑT@[@P]@O@^@@Z@S@L]@h{@]@SF@$6@@j@'@<@t@6@@AAX AAAA~AdIAAL@D@J@X@c@`~@`d@o@O@}@7@A@@ﭳ@n0@@;@%4@@5@@R@ٝ@@vȜ@!@@Ẁ@?x@4c@ Z@V@`H@BMK@EH@K@FN@BI@xS@œQ@!6J@H@G@vK@1i@0@W@0@ u@ @@@Ns@Ro@n@j@ AF7 AAAA6iAAAf@a@ּd@@@Ɛ@@D@@@Ÿ@ @k@!@@IҼ@@@3Y@Ϭ@զ@_k@O@ @U@P@R@r|@k@[@[LO@zB@d6@/@/@aA@zA@4=@{?@C=@â<@Q@@0?@P@Ge@}@@Ӟ@@~(@t@@Bi@*@@)y@rAeAC A A\ AA3AAA@5@>B@L@I@6@!@Zկ@4O@@@^@@@~ @ȉ@$@P@2=@F@@ߨ@ߤ@@ޠ@,@@j}@\r^@O@E@3@ %@@f@\+@)@<+@56@7@9@&5<@[E@O@*ud@5E|@g@d@8@@S@֩@T@}@ @j@AfAv AAa.AA:AAWZ@+f@ @v@o@n@@:@s@@D$@@@; @h@@/@@XT@s:@@꣥@Hz@P@f@F@0@^"y@ЁW@G@h:@+@Bh"@ @8z @i@UW@4@25+@G1@;@emD@$J@`FT@dd@z@@0@@a̹@@Y@@X@2@@+&@AQ=A; A4 A{AAY A,@@@@@m[@/L@@[2@@'@ @@U(@@R@p@@̰@Z@@&@@$+@Jߜ@@؂@/n@8X@w@@#@b@:@ @!@M@x2@/@D%@N.@7A@DK@L@܀[@Ss@B@XՊ@g@3@k@f@@@ @@@%ApIAAO An3 A A A', Agdalautotest-3.2.2/gdrivers/data/mff/0000775000175000017500000000000014020414072016174 5ustar evenevengdalautotest-3.2.2/gdrivers/data/mff/fakemfftiled.hdr0000664000175000017500000000021614020414072021313 0ustar evenevenIMAGE_FILE_FORMAT=MFF IMAGE_LINES=1 LINE_SAMPLES=1 no_rows=1 tile_size_rows=2 tile_size_columns=2 NUM_GCPS=1 GCP1=0,1,2,3 PROJECTION_NAME=utm gdalautotest-3.2.2/gdrivers/data/mff/fakemff.b00000664000175000017500000000000114020414072020005 0ustar evenevengdalautotest-3.2.2/gdrivers/data/mff/bytemff.hdr0000664000175000017500000000114514020414072020330 0ustar evenevenIMAGE_FILE_FORMAT = MFF FILE_TYPE = IMAGE IMAGE_LINES = 20 LINE_SAMPLES = 20 BYTE_ORDER = LSB TOP_LEFT_CORNER_LATITUDE = 33.9020838161 TOP_LEFT_CORNER_LONGITUDE = -117.6408421363 TOP_RIGHT_CORNER_LATITUDE = 33.9021473433 TOP_RIGHT_CORNER_LONGITUDE = -117.6285126655 BOTTOM_LEFT_CORNER_LATITUDE = 33.8918024197 BOTTOM_LEFT_CORNER_LONGITUDE = -117.6407652339 BOTTOM_RIGHT_CORNER_LATITUDE = 33.8918659225 BOTTOM_RIGHT_CORNER_LONGITUDE = -117.6284372425 CENTRE_LATITUDE = 33.8969750318 CENTRE_LONGITUDE = -117.6346393195 PROJECTION_NAME = UTM PROJECTION_ORIGIN_LONGITUDE = -117.000000 SPHEROID_NAME = CLARKE_1866 END gdalautotest-3.2.2/gdrivers/data/mff/fakemfftiled.b00000664000175000017500000000000114020414072021027 0ustar evenevengdalautotest-3.2.2/gdrivers/data/mff/bytemff.b000000664000175000017500000000062014020414072020131 0ustar evenevenk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skŭc{sc{{s{s{{kssksc{cck{ss{s{{csc{sskccs{kksks{{k{{c{kcs{{k{{{k{{{k{{ssZkkkkkc{sc{{k{ckksskckk{ccsccs{c{kZkskZc{sss{{sc{kkkscscckssZ{ssZcsZcckcck{cs{Jsc{c΄k{{k{k{skkkkksckgdalautotest-3.2.2/gdrivers/data/mff/fakemff.hdr0000664000175000017500000000013714020414072020273 0ustar evenevenIMAGE_FILE_FORMAT=MFF IMAGE_LINES=1 LINE_SAMPLES=1 NUM_GCPS=1 GCP1=0,1,2,3 PROJECTION_NAME=utm gdalautotest-3.2.2/gdrivers/data/heif/0000775000175000017500000000000014020414072016337 5ustar evenevengdalautotest-3.2.2/gdrivers/data/heif/subdatasets.heic0000664000175000017500000001273314020414072021521 0ustar evenevenftypheicmif1heicmeta!hdlrpictpitmFilocD@jcH  0Miinfinfehvc1infehvc1infehvc1iprpipcorhvcC @ @!&BZ$  !"Dr"@ispe@@vhvcCp @ p@!)Bp &rVZ$  !"Drb@ispe'auxCurn:mpeg:hevc:2015:auxid:1vhvcCp @ p@!)Bp &rVZ$  !"Drb@ispe ipmairefauxlmdatf&'ğ|q^3mRs2zh&:YWBHBxEU:rnَ;R{>$\;#_+8ɸKM$'mk\2]8Øΰ3 %^?5l򙺿M_m#%"j:f^8s&lXiOj!65Ҵ۱KtFvUc%uo}պZHx\a&kfF6~)zK$\:`]X۴ 0bk>KAT(擊 nË< uwu*5)%Jq }' y58ow-d )ngR/D&bL )p,ac[]x3A\ܠc}SNfLHiOV W_&ƮD3{7LΛh670,bB! *-[E>ȴ- b^M][}}-2gЁ6T@.Ka>ݛ1a6z/+EDtx8)t7 ɚkP BTNxjc"ի(\ Jf-lj*Ԧ,cǸSPek•p4x L.eu-z@ *nI^h$u F8rA'O0~H@&>6D'cmY&6o?mPZY.}i۾Lj5i .[e+ P/42mL)6?Kå#8uc)'J5/qyBb0 ըZ13z >` 0])DmfngSh2UHd=):MYaRRU}cx*Ϫ*A)np)1FBZ8 ͙"eB1MSSZ%vн󙤤iՃE3irV(>R#t+VQ1c9ϷO&wINe27I)bi)72d[Y}=_&IVp;cy\[UMdx7,$Vzbxv ֺ=hOF4V Ɛ}<>jUF&9o\um~T{k-#h3SyC*F{Lc w5U-wp}UJz*V1S p$p-*{vQwuM ׳E#K\ [zd-fRf1JIgs" F+j&qU #P Cy}0 g~7s+Y] WczcMbCW Ⱥ@_.oK4 uoߍNq =>`#ot`x* .&.`V~; b++#TV H)EQjܘRUMf, k=܍M^d#Ԧt{G.ƆI񋝚˘$+i߫jS"@TU7@+ Af׫)>?&pt f6`)? uz Q ,ŕ 0q XnrHWOBhK rs_rk @j ,&bN|# =p,ac[-Ufŀn\G2hB ʭ+ ,EBÚLu(BAs? i1N:r%;ߛ?(^pxgp_߈@`6SrDo|p{Cor45 #TMri] ~'&qe/.G$Jыd- Kۀ KYf_t#'d rO-"' 5pVs?߳D*i Zfoc :I)n?ƚ'rEĢ9!*QՃ^c[1ٝTFyw:S /1TɮRiݨ%S.VB"X,+i۔WO8!NI# aBgugvn<\nCnϲԊGq֋}IJȜA-%E\QX豜HC>ZH/}1ps}Mc]jӅDvNOg}F Nf|5ߐv->X3Fc~-*S5%g JcqآT/;\Ѡh5KIӷDiw%ުT FS)pGZ5xIX?e^b>tZO4މ6g&50Mt$'uw}c1_xIxgNEB,<@~;GHejml߀\gev;Ղo[XՠbQ4R ~_ }:3ȜUc3Jhgf#R}AkAc q#zEy֘2'E7lGV7syqW2d mrI>Vr|-3׈۟7Kg%6Y,ӯ|LGg S t]^bSܦC:'jt*w"o٣#;:UԚ~ʿdi%,+rwUk"|Ic}4`'(+)@?] "p=Zhܣ l;s 3'Ȯ|[z?. ۇH%\Ncoʑ4L 2fB4\rM}\.n6Feb=:YöG șvJSc`rw|䘁7KҁE̘G1c}B+ӷ,r>~M"yL?n+Pk/&hI4~V9RtA #Ea Dz+ԁ !TЂZ䏤+Hbu8Zm iY kH44.#؄Aq }h|˗:2tOsMfq#c`x~ukZ\qÑ~e/DxVP0F<2xMCBֶ`d0Ħ֐e+ \(S;ԑ&lɗPs9bB{e}9nO wKn&(ʊ8HQ4Ŭ  1}rd MwlZe W  m?Fvp]s[^?$sˆ|&k 87"ؚ-~zaΦvtBD_p|hBx:~|fTwI\yjpMJZq9aMA2q{7#v-Ἳd &XS{46DP2q}„\,C .k alT*R?e._2KǢ&^2>C7 :*P`L|FR2M(xI@'Eihh1Jy @eGFά-hKD*ѬGΙ[Rއ,̓4xG9IMOu@q42 FMY\q#W}}ZoD_ǼR" y-`,3xȽѠO^>@#8VG.QWJK-$4VgU fHƓ)?[Gя)J5],[392ԽaHzF@6C|6x?)>dO<"ȡ/Y#=ԨMMx`8W ω|^-=TUe13 #KvAC rlƀ1MѧovD-^4ݏix.3}Lh[DB >D lוE 0DDMJ}6 E%ǯ bj28 ׫6:3=;>@2 췍NM1s ϯ Rsl:Gq[]og1$`cө/><_zeɿ(A)CV-cexDxE,#!k5Jr4Q4d\8^EUw90z~ÿ*rUCiHkJZBvuZ+!p/  ޝ@Jе30\YɄ"~"!+aYAڵâ`~U[O2J)BV$&ݏ &@%qHL@Z; 9^U^}p/NJa )y(g)Hs6"Vc9{]M-±[فin]jk! {C'H)y`*jƊ(*N0}MshCL\F\{!{K;@ '86| +}&E`CDx؜z89j6`Q_L`,'kL9?8 Title Description XMP Test _&'ğwr o=mwB6YH]ʍ ipR8ۯ".GDRO OoQf#loiZN/ {a82>vAyfUwT$33{7ЀVz?*^q< l_`)iľt)0秠ӳw]M:x1zOaA=Eؔ, ܰ,!B{wCxs~PKOL<)\K{KK 5!"SPJ,&A4V˄\A/ʐJRÞ )gdalautotest-3.2.2/gdrivers/data/heif/byte_exif_big_endian.heic0000664000175000017500000000320114020414072023302 0ustar evenevenftypheicmif1heicmeta!hdlrpictpitmFilocD@j@biinfinfehvc1*infemimeapplication/rdf+xmlinfeExifiprpipcorhvcC @ @!&BZ$  !"Dr"@ispe@@ipma(irefcdsccdscmdatf&'ğ|q^3mRs2zh&:YWBHBxEU:rnَ;R{>$\;#_+8ɸKM$'mk\2]8Øΰ3 %^?5l򙺿M_m#%"j:f^8s&lXiOj!65Ҵ۱KtFvUc%uo}պZHx\a&kfF6~)zK$\:`]X۴ 0bk>KAT(擊 nË< uwu*5)%Jq }' y58ow-d )ngR/ Title Description XMP Test ExifMM*JR(iZHH023001002016:02:15 09:37:31gdalautotest-3.2.2/gdrivers/data/heif/byte_exif_little_endian.heic0000664000175000017500000000417414020414072024050 0ustar evenevenftypheicmif1heicmeta!hdlrpictpitmFilocD@j@biinfinfehvc1*infemimeapplication/rdf+xmlinfeExifiprpipcorhvcC @ @!&BZ$  !"Dr"@ispe@@ipma(irefcdsccdscmdatf&'ğ|q^3mRs2zh&:YWBHBxEU:rnَ;R{>$\;#_+8ɸKM$'mk\2]8Øΰ3 %^?5l򙺿M_m#%"j:f^8s&lXiOj!65Ҵ۱KtFvUc%uo}պZHx\a&kfF6~)zK$\:`]X۴ 0bk>KAT(擊 nË< uwu*5)%Jq }' y58ow-d )ngR/ Title Description XMP Test ExifII*agbj(air%``02100100i. : : : : : : : : Ng*EIFB)d7dC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((i" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzgdalautotest-3.2.2/gdrivers/data/heif/stefan_full_rgba.heic0000664000175000017500000001756314020414072022502 0ustar evenevenftypheicmif1heicmeta!hdlrpictpitmXilocD@H = 0m biinfinfehvc1infehvc1infehvc1infehvc1iprp|ipcovhvcCp @ p@!)Bp &rVZ$  !"Drb@ispe'auxCurn:mpeg:hevc:2015:auxid:1vhvcCp @ p@!)Bp &rVZ$  !"Drb@ispeuhvcCp @ p@!(Bp0eI)l@"Dr"@ispe`X'auxCurn:mpeg:hevc:2015:auxid:1uhvcCp @ p@!(Bp0eI)l@"Dr"@ispe`X&ipma 6irefauxlauxlthmbmdatD&bL )p,ac[]x3A\ܠc}SNfLHiOV W_&ƮD3{7LΛh670,bB! *-[E>ȴ- b^M][}}-2gЁ6T@.Ka>ݛ1a6z/+EDtx8)t7 ɚkP BTNxjc"ի(\ Jf-lj*Ԧ,cǸSPek•p4x L.eu-z@ *nI^h$u F8rA'O0~H@&>6D'cmY&6o?mPZY.}i۾Lj5i .[e+ P/42mL)6?Kå#8uc)'J5/qyBb0 ըZ13z >` 0])DmfngSh2UHd=):MYaRRU}cx*Ϫ*A)np)1FBZ8 ͙"eB1MSSZ%vн󙤤iՃE3irV(>R#t+VQ1c9ϷO&wINe27I)bi)72d[Y}=_&IVp;cy\[UMdx7,$Vzbxv ֺ=hOF4V Ɛ}<>jUF&9o\um~T{k-#h3SyC*F{Lc w5U-wp}UJz*V1S p$p-*{vQwuM ׳E#K\ [zd-fRf1JIgs" F+j&qU #P Cy}0 g~7s+Y] WczcMbCW Ⱥ@_.oK4 uoߍNq =>`#ot`x* .&.`V~; b++#TV H)EQjܘRUMf, k=܍M^d#Ԧt{G.ƆI񋝚˘$+i߫jS"@TU7@+ Af׫)>?&pt f6`)? uz Q ,ŕ 0q XnrHWOBhK rs_rk @j ,&bN|# =p,ac[-Ufŀn\G2hB ʭ+ ,EBÚLu(BAs? i1N:r%;ߛ?(^pxgp_߈@`6SrDo|p{Cor45 #TMri] ~'&qe/.G$Jыd- Kۀ KYf_t#'d rO-"' 5pVs?߳D*i Zfoc :I)n?ƚ'rEĢ9!*QՃ^c[1ٝTFyw:S /1TɮRiݨ%S.VB"X,+i۔WO8!NI# aBgugvn<\nCnϲԊGq֋}IJȜA-%E\QX豜HC>ZH/}1ps}Mc]jӅDvNOg}F Nf|5ߐv->X3Fc~-*S5%g JcqآT/;\Ѡh5KIӷDiw%ުT FS)pGZ5xIX?e^b>tZO4މ6g&50Mt$'uw}c1_xIxgNEB,<@~;GHejml߀\gev;Ղo[XՠbQ4R ~_ }:3ȜUc3Jhgf#R}AkAc q#zEy֘2'E7lGV7syqW2d mrI>Vr|-3׈۟7Kg%6Y,ӯ|LGg S t]^bSܦC:'jt*w"o٣#;:UԚ~ʿdi%,+rwUk"|Ic}4`'(+)@?] "p=Zhܣ l;s 3'Ȯ|[z?. ۇH%\Ncoʑ4L 2fB4\rM}\.n6Feb=:YöG șvJSc`rw|䘁7KҁE̘G1c}B+ӷ,r>~M"yL?n+Pk/&hI4~V9RtA #Ea Dz+ԁ !TЂZ䏤+Hbu8Zm iY kH44.#؄Aq }h|˗:2tOsMfq#c`x~ukZ\qÑ~e/DxVP0F<2xMCBֶ`d0Ħ֐e+ \(S;ԑ&lɗPs9bB{e}9nO wKn&(ʊ8HQ4Ŭ  1}rd MwlZe W  m?Fvp]s[^?$sˆ|&k 87"ؚ-~zaΦvtBD_p|hBx:~|fTwI\yjpMJZq9aMA2q{7#v-Ἳd &XS{46DP2q}„\,C .k alT*R?e._2KǢ&^2>C7 :*P`L|FR2M(xI@'Eihh1Jy @eGFά-hKD*ѬGΙ[Rއ,̓4xG9IMOu@q42 FMY\q#W}}ZoD_ǼR" y-`,3xȽѠO^>@#8VG.QWJK-$4VgU fHƓ)?[Gя)J5],[392ԽaHzF@6C|6x?)>dO<"ȡ/Y#=ԨMMx`8W ω|^-=TUe13 #KvAC rlƀ1MѧovD-^4ݏix.3}Lh[DB >D lוE 0DDMJ}6 E%ǯ bj28 ׫6:3=;>@2 췍NM1s ϯ Rslb0ϷçTC9M8Q 5Z^C`oKI~>!$cy AӘ(sZKm:؛TB{QpIGWֈa)Wwϻ39EWC'.{i+x+Xm[6[kݠNE<|u.]!T#="oNw7+)dU̙Rn_$r;Շ}#jh$^U_&|RƼ1Ѳ3z6ucx'e(/E0$]w!/+:!H m|]9S'af#}лßADW0+jǦ՟)KL8~+j]K$vS @8wXMRD{aט-kE1BE\S jҶS0"&@ad*ՔQw7H+?nqq3·caVݴψ%xXo7DrkklEU3 ?\)q10n':KEׅCt2iD;`weI?oB\q.wRM"Ƈ#鉤_%!+s$Cƈ M9"5pPUegģ8/ba,Ymcii-;A7Ib څPh2r``%~ 0a'{¸N)mUuHDw) L_4H/;`H tY;{rL7ͬߤq{$$#$L[v^6կ"lי*!ᩙo}rPK >A(IlϯRB~JGkjMi}Y/fEOiu B5Ȏf JģdSsPQ/o狻)Xȗ@-I35U>Fh#v@ptm;I~Vz#!nTɦ!qS-˪ncqD+8 _;N&ã14}tf;}Q8~@l=ϛQ)^UGuw.<H2l8ٻM'z(N9Vxw(05ȇ>i ?36GFΰϪ1|gԧ(jNF ?*=ۣg$np$waE -0p?]O.1lq*k죊t;8n}I\>alyCJYeR6^G:wBnOo8N1=Š %ݭH0$#I4/=?C/l%L: Q^e,mpM Sx;_S73%Pq[`ׄ1 R7=Чhߑ0)TM( [J ^p|1}Yuy0QB^+m ![a{yѸ{$DОy"cVB颗N"v`t+Rtjcu݊;JkK*D]@'R3b?Eϳ H3--Y l' Ecu( J{jNS0rҷ'Rs@KEe2C'.gdalautotest-3.2.2/gdrivers/data/heif/stefan_full_rgba_16.heic0000664000175000017500000001217214020414072022777 0ustar evenevenftypheicmif1heic%meta!hdlrpictpitm4ilocD@E ' S8iinfinfehvc1infehvc1diprpAipcouhvcC @ @!)B &rSeJk"Drb@ispe'auxCurn:mpeg:hevc:2015:auxid:1uhvcC @ @!)B &rSeJk"Drb@ispeipmairefauxl=mdat&bL3fu:D&^.*߀B*7C|G2E՚z'h_ E$dxTH9C4:D9y1퍗hXAD隒 +5&`}O;<PC k\ 2yj<9ՊGk11hGa!ݵG05TfaΥ.MpΌnշ38Q7u9_t7IvA تA9P)Bo_xi KmPٕ$6&҆hUeԣX1 smR/5| X myx_$!mRyy4̟dY)ZR ŠC66t?TMn0k>VrBڰ6x|7څÁ }}k 3rJJV3v0Lٌ7ɻ*b-KR,&,]bZ i4o@7B[\=SJ ;y"" V:N4*LȬR}1(l2\0|0㣳 h198ݹ`٤;nIKpG1ڑێez\U9-FFvt5L Hӡ+xs>&|xQ3a޶+߃R:j|E&6rUmSC:s=rû oqg'3SY [~*(ߡLz ´Ag}JSA26J`n=>`di]JO~nӪ>NDur H428|xNof36mvJ=!  7^I] F0JRUe7~ DY\n5Dٳ㲘h}]N#Xip zQX99n6Oz?RZ+ ^S_{MDR\o*0fҊ1zI[yO'Ox~UD_I<8of O&b^LAD.ˆ5TG1V՛V|QCB258i/}*U78(t]$Mׄc̔uGveXL*73bO>Cwz}$><RyŠ`7h>()5R#ib[X]u(Tw3I8EZjϕ&ϪLک z |!LyDʐ[g $uQk q/;;a7RoMn0 [cxF+;?TNA3- !/`KFBR3IJTs%ap=b]ɮ<8a,&K2е^kNT-v2D@7U Ӂp+:7׸bC/crݳ;⏖Suwy{_fCoGb?쫥Ћc\c` 0AaސG}"<.q9M )M湄sc`>2δ<"<5 k|nCq:I*"PG<$/dx\?Q|jJbUGZWSҚ/-P4㩿= mw*)t.ˁfx3.ѾRe<СMWjۗ:N`[=8'TAw3%s^DO `k(.RD_M5S"B&2-N[ӿݥApq%mLrB'o`2heP` #Kx5b%vgxnNsA^qOə72qo.=lG>g͖?DXP^ ( z@cRH0[]S1yD!YU&@Tyc+}=*jÏT@miΠoýr]I"p:d5T`S k T\@#5 kHQF !>ԅy`F ۶U?+n0ߨssnN6ȪfT5*^|;ΐ y'Փ+4-QړZq_ 9_W-\8!202z T`㷣SD-!ސzZ)RȘoöb]dQ'QJojyޏnT{k\ݤ9lOlah3K$ALjULsq$RTZdA̙6qZEPC{ATo2`ȳ4)R; ԑ45){ zV$pO|.\|DP&xS9<e!Iq\ b L!loCnq;+wQ~k=v㶷{i?'(`(6h1bR(V_\je3&(ΑȧǷiF!?9q8?4CnJPBX5fh;esVkh8I0ihU|TE{" XFঔ?ڢ6E_x\P+١<&Qr' ghI樹boc.kԣ)+6pK8oIgn[2ha L;!$).cѦSvWJOh\\nlj=Gs(h3zkFx w#DY?>s%Ic #:d8cn˴umPw,xW(%#,ADtkJWhEPDtC'p_]5p$8[Ԗg^ov>¶Wh=ȶÎqFXKYGʒ*HP=hfoH9UgonY6@܆Cv >5CLdgdalautotest-3.2.2/gdrivers/data/heif/small_world_16.heic0000664000175000017500000003675014020414072022031 0ustar evenevenftypheicmif1heic-meta!hdlrpictpitm"ilocD@M<#iinfinfehvc1iprpipcothvcC< @ <@!(B< eJk"Drb@ispeipma) j?Q΄c +΋VLҪFp4E&}u) r>a 7ex*gzݵ6;lJ5vxche4_j1rK\>p &Gp!ҩ^)?pLL)1̴ ˸I,E5~(f7=y:Ъ&'ȎsDpdֈSYB-ui'{/ FNq !u1 i&jyIj}U{z .nlRpJKg6U'g,)ʧ_S!6M GM{99dm'p.6dGח0u.1C=7脷{&V̳f-.^І4aliom{nAq93b$X6"6Kd؁(#ꭟ0OEˋeA~][te=D ٖZ gaRVvr 2.> 4Ik)3huLV&)tipl#WTe;l,\:7T03.~aASem 6xŶXYkΈ [eB@1GKn=UD|V D|7-A/>- vDثW ђq F]{ q}! Dlqoad@`9A{yVҋʯ\yۨUN_}m}1SѝCQC¬K(qM0<"tZdNvѯ0ώRe /l*[Ӧ'U ouv}K)\FؕԉGyWIVWT6zɬ?ud;΋sy~Q&BbyWaiNɞct$5&m.ȨF;Cg I% AZs#ddM8 `.> Ҁa)|e4Jc,W'BUy_`]M.fT*j[`"Cg!R$ ?C` qvfGb'MxW@A9e]clc,9,f:4t Dow}(:gn%F;fKhF:kc ߦ6U1B裎pfzϟO7d@ WA.4:$="yVti 1ghᾼdF;1(լ} k5 8@kޘf"ܸwr- A}!yJЯȭF KK4۾:2׌ ^,}OO,lOJLz$ Ij:εoÖH4r7%PS! Әf"9x~kXpg<^:Rg1/i%T.@&ϿY31O_O yhUͨ<<-c(W;JOZS_"Rtڻ[V4l=FE=֫-+xOMKbpA5∊Ҵ.k}OMN+ZJľ1ɍmdt?ܟ":Ǿu!R ʃg"D0155-,8doG-uci=,pz2;[<_-c Ny(y@/#>b` ilղʝ|$6:fԺ}\~~:;+(4coj4gw T=7uOhhϾPz]OeT/,p[Sy]0šx}&6KVj[ {xR K9擳\Umc6[=9X@!Xٟ 0?ZU]Mz/" >2 Zk0'kE'&Dl8*Kx/s%nIpC#ꔉ e `Fd ϨEK-B{7`^6 d WaD*XW1;Tv= ?ȝTݾ=/#{$M :_!mO&D+,|ꠏT4"KGcۧ}r;AcAT7cƏC_Wa@> >4JVQ[m+T|WTL ڿ: pΙxYf4Z& |{rO'T%1ϕw$kb&&4e K;=#}L$4#^g8Sy"P_ie94:tN'KVd-xZ3t,HaMK_A>'ys܆]ÿ駈VǍ%M8FiQI77 5']2W%ѾJ؜as)Z܄DQP&{ 6P9@ک̚&W^ 2}I|v _rTMFjb [sK.I=DMj9DOyɄR?`Lɡc]zxCTaLjJSw=n8ʪ(70\/٩߸xԦ|M0)yp_>҅7cvwټ)zvH`%j~XoϜ@'ٌl#44̍}_< m.22Ff wDXG8uZ8^4)S/h%`,1gAs˻0jj*zyC_ 摥=K,hJLvԭ u; K@Kb*2( utÕ3?NâIU2SD,OIYaQ,lo^4=KH"031fTEsa7)pUhǀgVCYhVOx#rJ_(ٜL&7`)K*wt'D5,}47A_4d-\[ 4M{@$HAUCCEmXC/|c202}Oa1tqY))%Ew%5!p>rt۲Exb$IZt ;>=[0NuGvoo;Nb#R~1ze.Ф({".6Kjz Sb\g b_1*_G/1pHYZ0LyXmUSH#L}B8#ϚfҽX1K 6 t< kOnp,Bzs\_+vI;Ž@knkQ[ߜ/qk* Q!\tqWA `g}0( ev1#]gSgf.H;pja.y:6u/rF1?V@~f[B;tSIK>{>g%ܣnoS%~,nteZ4H)ӷLN.-N EW U}n;H\GzZWpcRơϖ˗ee-k0״ջbWR"| Ii'%Su/ sijrzK5h Aw>ʾ婛{9Oi! cjGv Rzd:cnǧrd{x;T__3l9q6T'Ifb1d~֩f\l3t56u+DE\|?(1*"afTF˚ʊhHW5<{rկ:[/\wACQbswT+^AUPM֌`T!XuѧESO?I`p(B19l{f]yw|ul~(~ ,䔕4Q^xŌ`2 )אrr ԢL0B¬ë>^Sq|1 X!"{פ=j$F()і#X:iC-gǘGw˽C ٚIx (5rUHk/LYV($`m! nH `PH塘id :K]/t3MW#VD$XҀnguQ6$}eb~-dGΣARfN- ńHT`aJFL5d7tBƢ?67KJ,;*ߩPF>a>-jE>4^*NpU^Pv@&B@:%¥4U@C 2$kHiH\9WyhrGs|x_3Xl]9aRZ X )h Wȅas.rAW(ECb 9!aQIN[cVTbWSekgIlA攝|Ji\i:8C >eЇܫ9 {]u^SjbU]L#o5D|ELa*3a-CP3(҇4흔KӢd~m'L%"T X iec(U@wVk͝ p'w"j vPܤp١a_mU),3~dġwSEߒSv4y򟧴?%͖pz@WL ) Q*7>[ kzadTZ2owg"CܢsQ )osݢ_<e#Nf!p+L!<þb}Ui u7<"XC\ FAyi ]-4}QW`PPEA#9$2"1A 7`̷`7Tkѹ\<%7leǕT.ra,?ᅐrv4L]&6Ҷ+umA@k;>s,1h'Pvc(ݯ)bu@Kv!Vš݇d_ ]eMqpd1MVI@+GGіLv e^^Rh+WBOl%?u :X< \IQ9>?JW{4bTD:'V<]JEP߰f4k6m hH7;P=!vƔoWHJ!=Ujēp[hS 5,uUeݦU$U"a +09_2'=A Gqq7 WZ܂Aқ/Nف@ 3y;Fr RtiIв|n.]wjYQI^^ S6Eh '8Rmcn΃n8]\ETBf.[,)-3'L" ?q062u>|8RX 5?M{ B-?l9ge%O^=Ǵ?~i p,u Ծ$05 "[|܂YxOQ-*~ЧOTBy=h⯴Krqaiq?9asK{j褻-MSTŞީmkAI8`n0M:.YxT@|iu nF\"Γ%N17YQ- $֦tuY_ob.$I(tg=i<^㞡He:b3e1q_TH=+_c36%f%En~@4g$Wn2曙F2/=?GW.pVbBgt6wx))9X-tbܦtPȍdHC׹"\v& 11,yRJνDhV{&{Br DOsgzkO 'L "+'3d+fLV0Dɺ]{ ͙W0z51u ?M"WX3*eSm(==fdYaQ"ܛT̜J! X$SA ;\hےȋK`j \m+?nv9bY[|o ÏQοZB |7.7ggGxe\D&qsVC2A7mp1_U =X6eaX( F rs.U}Ў"^xY$yḑ|utSzaGca,q hc]B6ZmDa<*TWxlx'/t'0qn.ZaA1o_y:bSG<0޾ZC|B%zɛkj]H&yiK4iO5l^Gsbg (x5@P7(Ɏ++h77JbԅMhqx~t[l={\S/X@VUvrN;jƢe l+ S%x7Mã1azWl_(/xURDj#MtEV̢&DjE頪ZZ.Ƃ[q3|̤5Vk6yz=6vL߬I&;3=0Xync1aqԣDp!>C#e/y41-tFju!d1DNdڮǐg7Pvf@jJr2SAZ-R?\N1:z@d(B$c5U\fCvW/j7Jtc$WI2ĕB:\ 8n GGQ io:/!̥z|)rqp_J&?#bu'YcSXyZPX]d#žyjo,FHMpUJ:mj5I\&]JzDpSa͐`\S0GݝBԜAynXPϿz op"<] QRn jO.+YIa,?k+JM7V ea%%jIN0x`5ގ D UE|%^ U֞$^gVOϚpU,PN!^sQҺ 0W=_;lL9v ߕ;4}0&i{h+v+' fUMS/غ!Hi1KZ !Z0Ӡ?*X: `̛JYp 0=$NXu&( }mT X(lTPј7=t݅jTLhrUf0o2DҺDƌZKMjN~|#.S4T6qU啠e^J:3O~|#xcyŵ^ŀD,Դ2T@d{_ߵUE;~^`Ib͋LisYmZ[^-p?L&O$= v*uް!oC38)ōW)hyb\Q ߉3G1LITQL\sK/@'*%I1N vEϫI/s x4ow@n\e;)E FR+֧/3'm`nF"67Qc-jDVH9HOihDb JPuSkDpFb.IO-rzrka?ZTk<MN^Zif{c"`ܝXFjy(k.G jd#UL%19F=?b@x^.` 2,GSíA45˶[)VѼB} K)Qٍhk?UB%Mq|:VLrcÇl=' v9h#Ku.Ǭ5J>IXA<ZWr^ŏԭƓ~Bg97( Nþ3S} F9H0v9fƣM`d+Qqa]uEr| MIKjyR65yzwJ SJEhK.>@*\i K}5D#vxb ]7o361[j5]|lIfrr>G$ n@?{3R!DfB|: 3{mR Rsw :| ^G;0=MS5"l"ES;?>ƌ.vs@Nu|(0Vh|QqGώ]`LC8\Fr P/Ȯ:y¤dIu2w*"F!ғL94JSKVӗGH\H7*O1QF VA^0eAH$:1yj8UۯzyBޕf}k~?quu!4uiſ7cb j>%U<GХ meVsGy*zf7$@ N̸:d[=z3`k=;N~kľ' !x.qg=sJQ!kE?dx!L؝l ,$(+5yV+J||s2sŠXHqKZ_ɂk5oYmU -mHCldJ]q!VILC4͛‘Ɂ;Ph 0JMՐxhQsWx\('V6较bP^?e8ٳOVJ4LuΌhOAeAOƟEw5O>)gJ6mݶ %/QYuҮ=؍>]N̥qny@ ve4 .iVP>ȶWpމڻee&X|\TwKد| 3G='ɺ5-eo͢LytG(N( "4׳l/aIN]1t/2Xk 0~ .'%8pԚ8*NHzٌB*^ԓֱ]N֩a7UY}=;k ܬj=6VJi6SW]7op?sO>m7%dLmigX)759VCܽK@I⤬WJC_͵Rbҵ ?O4w҅ԁmCRKE %+a(/X8(`roR!s8y.1W<$i4zi+.@7&NzDQN2eR[0C])%5^SJ??"Fk;Af];˾s,\]X4z)'y.$zCe$J Ό4FЕ-MRiy l[!TkJ|da $~ ^07|; Ajŏ+A 9,b~klwQIOi: BOF6s4sgCf4XE҆|B7е1r[$+L:V{wB?ZD'1&j%B ϶Y4dF8oF6K8.l60vMGD%Kؚ;,)NZ;Լl+0%q`pkx-JPpUo Uxv>կj 6 9J:'3awRN?>z =\ARsaOMՇj#)MVn[—x1x80TڈF^Tc'zKt tEXx.ԲH҂2fY Hj.ݿqS16\ ʛ<-D?^n~rjNΌ#7Jq>7 (A $ƒ '?$=I!oP}et,=ȲB{`7!0s+PՃ(N `q⋍ \k\ƃHU+/U 'ʢuI!`RC.dLj2m^){~o`S +oM3Z(cل &&h d DAgF Zo%ms57Z0(pw gFhodHBh c)̂FM)alKlu<4؊}!/DdkH'_-zOja J%A*5if1('"}o cl2H"{a~GVm"HsA{@~DVEɨ3mL,mocH3bl^S&mJl)4ȐZ ?+ fSn:2ֽşkV˕+E5~ `3T0LGu.(vٷ|0e_YUfԯ\s9DA>^OKyz|"Q\%En8F ,|P/ hxz*R bKlHH_D-RR~0x&9mf9* сӚf|=2_8SrMdFj4RqaH̬X䗍NRv]ӘX]VekSj49D)3THi=qō]mT~B M`SS+?vs[}{mJZ έ;XiB]r']s$&4 5gOb3cg3I$m{^Z%,6> TH>.]i3dgj̵/Ѐ>wrqk֦2\I-:%RL>zWX8*>b\5@gdalautotest-3.2.2/gdrivers/data/adrg/0000775000175000017500000000000014020414072016341 5ustar evenevengdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG/0000775000175000017500000000000014020414072020006 5ustar evenevengdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG/ABCDEF01.GEN0000664000175000017500000000324614020414072021413 0ustar eveneven008182L 0600115 340300003100000010420031DRF0570073DSI0440130OVI0820174GEN2290256SPR1290485BDF0500614TIM0390664 GENERAL_INFORMATION_FILE1000;&RECORD_ID_FIELDRTY!RID(A(3),A(2))1100;&DATA_SET_DESCRIPTION_FIELDNSH!NSV!NOZ!NOS(4I(2))1000;&DATA_SET-ID_FIELDPRT!NAM(A(4),A(8))1600;&OVERVIEW_INFORMATION_FIELDSTR!ARV!BRV!LSO!PSO(I(1),I(8),I(8),A(11),A(10))1600;&GENERAL_INFORMATION_FIELDSTR!LOD!LAD!UNIloa!SWO!SWA!NWO!NWA!NEO!NEA!SEO!SEA!SCA!ZNA!PSP!IMR!ARV!BRV!LSO!PSO!TXT(I(1),2R(6),I(3),A(11),A(10),A(11),A(10),A(11),A(10),A(11),A(10),I(9),I(2),R(5),A(1),2I(8),A(11),A(10),A(64))1600;&DATA_SET_PARAMETERS_FIELDNUL!NUS!NLL!NLS!NFL!NFC!PNC!PNL!COD!ROD!POR!PCB!PVB!BAD!TIF(4I(6),2I(3),2I(6),5I(1),A(12),A(1))2600;&BAND_ID_FIELD*BID!WS1!WS2(A(5),I(5),I(5))2100;&TILE_INDEX_MAP_FIELD*TSI(I(5))00060 D 00045 34030010060000DRF0090006DSS010101010100322 D 00151 9903001000000006000000000DSI000000013000000006OVI000000039000000019SPR000000061000000058BDF000000046000000119TIM000000006000000165OVV01ADRGABCDEF0130004606700046067-0000000.50+480000.5000000000012700012700000000100100012800012801008ABCDEF01.IMGYRed 0000000000Green0000000000Blue 00000000000000100502 D 00151 9903001000000006000000000DSI000000013000000006GEN000000219000000019SPR000000061000000238BDF000000046000000299TIM000000006000000345GIN01ADRGABCDEF0130099.90099.9016-0000000.50+465959.48-0000000.50+480000.50+0010000.52+480000.50+0010000.52+465959.4800869134101100.0N0004606700046067-0000000.50+480000.50 00000000012700012700000000100100012800012801008ABCDEF01.IMGYRed 0000000000Green0000000000Blue 000000000000001gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG/ABCDEF01.IMG0000664000175000017500000014400114020414072021411 0ustar eveneven001852L 0600065 340300002000000010420020PAD0280062SCN0300090 GEO_DATA_FILE1000;&RECORD_ID_FIELDRTY!RID(A(3),A(2))1000;&PADDING_FIELDPAD(A)2000;&PIXEL_FIELD*PIX(A(1))51015 D 00088 9903001000000006000000000PAD000001769000000006SCN000049152000001775IMG01 ~}|~}|{~}||z~}||{y~}}{zyy~~||{zyx}||{zyxw~~}|{zyxwv~}}|{zyxwvu~~}{{zyxwwuu~~||{zyxwwvut~}}|{{yxxwvuts~}|{zyxxwuttsr~}||{yywvuutsrq~}|{zzyxwvutsrqq~}||{zxxwvutssqqo~}|{{yyxwvuttrqppo~}}{zyyxwvutsrrpoon}}|{zyxwwuttrrpponm~}||{zyxwwuttrqqponml}|{{yyxwvvttrrqppomll}}|{zyxxvvutsrqponmmkk~~}|{zyxxwvttsrqpoomlkjj~}|{{yxwwvutsrqqpnnmkkji~}||zzyxvuutsrqqoonmlkjih}}|{{yxxwvutsrqponnllkjihg~}}{zyxwwuuttrqqponmlkjiigg~}|{zzywwvuusrrqoonmlkjiigge~~}{zzxxwvutssqqpnmmllkihgffe}||{zxxwvuttsrqoonmlkjjhhgfed~}}|{zyxwvuutrrqponmlkkjihgfeec~}||zzyxwvutssrqponmlkjjihgfeddb}|{{zyxwwvttsrqponmlljiihggeeccb~~}{{zyxwvvtsrrqpponlljjihgfedcca`~~}|{zzywvvutsrqpoonllkiihgfedccb``~}|{zyxxwuussrqpoonlljjihgfeeccba`_ؾ躔ďɗzxwutssmlƊfddcb_^Ʒˮ񙅄xwwtsrnlddbba^]쭬뒑髏퉃xvvsrnllҀjsdcbaa]]ڴ퐊}}{zzxxwvurnmlkshgfeccbba`]\ﳲڪ}|{zzyxwvutnmlkjrfddcbaa`_\[ڐ|{{yyxwvvttnmlkjj˝ea`__^[Zᬫɨ皎~|{yyxwwuutsmmkjiiho`_^]ZY짦zyxxwvuutsqkjjhhgfef}^^]]ZX}zyxwvvttsqqoiihgfeddbav^]\[YWׯڤ茌닅}|xxwvttsrqpmmhgffedcb`k^][[ZYWW祈}|~xyqqolkkfeޤ{fe]\ZYYXWV׻穩ơ}{{{poolkjid\ZYYVUŻѳƪ졠ڇ}|{{yx{ŏonmkjiigʁ\[ZYXVT~}|{zzywvvuttrqppnnmlkjihggeddcbba`^]\\[ZYXXVUTS~}|{zzywwvutsrrqonmmlkjiigffdccba`__]]\[ZYXXVUUTS~}||{yyxvuutsrrqoommlkjiihffedcba``_^\\[ZYXWWUTTSR~~|{{zyxwvutsrqpponmlkjiiggfedccb``_^]\[ZYXWWVTTSRQ~}}{zzywwvutsrrqponmlkjjhhgfedcbb``_^]\[ZZXXVVUTSRQP~}|{zyyxwwuussrqpnnmlkkjihgeedcbb``^^]\[ZYXXVVUTSRRPO~}||{zxxwvutsrrqponmllkiiggfeecbb`__^]\[ZYYWVVUTSSRPOO~~}|{zyxwwuusrrqponmlljjiggfedccaa_^^]\[ZZYXWUUTTRQQPOM}}|zzyyxvuussqqppnnmlkjihgfeecbba`_^]\[ZZYXWVUUSRQPPONM}}|{zyxwvuutsrqponmmkkjihgffedcb```^]\\[YXXWVUTSRQPPONML~~||{zyywwuttsrqpoonmkjiihgfeeccba``_]\\[ZXXWVUTSSRQPONMML~}|{zyxxvvutsrqqpnmmlkjihgfeddcba`_^]][[YYXWVUUSRQQPONMLLK~~}|{zyxwvuutsrrqponmkkjihhffedcba`_^]\\ZZYXWVVTTRRQPONNLKJI~}||zyxxwvutsrqppnnmkkkiihgeeccbb``^^\\[YYXXVVTSRRQPONMMKJJI~}|{{yxxwvutssqqonnmlljiiggeddcbba`^]]\[ZYXWVUTSSRQPPNNMKJJIH~}||zzxxwvutssqpponmlljihggfedcbb`_^^]\[[ZXXWUTSSRQPOOMLKJJIHG~||{zyxwvuttsqqponmlkjihhffedccb`__]]\[ZYYXVUUTSRQPOONMLKIIHGF~~}{zzyxwvuusrrpponmlkjjihffeddbba`_^]\[ZYXXWUUTSRQPONNLLKJIHGGF~~||{yyxwvuutsrqponnmkjjiggfeecbba`^^]\\ZZYWWVUTSSQQOONMLKJIHGFFE~}}{{yyxxvvutsrqpoomllkjhhgfeedcba__^]\[ZYYXVUUTSRQQOONMLKJIHGFFED~}}{{zyywvuutsrqppnmmlkiihgffecbba`_^]\\ZYYWWVUTSSQPPOMMLKKIIHFFECC~}}{{zyxwvvussrqponmllkjihgfeddcb``_^]\[ZZYXWVUTSSQPPONMLKJJIHGFEDCB~~||{zzyxvvttsrqppomlljjihgfeedcba`_^^\\ZZYXWVUTSSRQPONNLKJJHHGFEDCBA~}|{zyxxvvussrqpoonmkkjihhgeddcba`_^]][[ZXXWVUTTRQQPONMMKKJIGGFEECBA@~}|{zzxwvvttsrqponmlljjjigffedcba`_^]]\[ZYXWVUUTRRQPONNLKJJHHGFEDCBAA@~}|{{yywwuttsrqqponmlkjiihffddcba`_^^]\[ZXXWWUTTSQQPONMLKJJIHGGEDCBA@@?~}}|zzyxwvuttrqqpnnmlkjjhggfedcbb`__^]\ZZYXWWVUTSRQPONMLKKJIHGGEECCBA@?>~}|{{zyxwvuttsqpoommlkjiiggfedcca`__]]\[ZYXWWUTTSRQPONNLKJIIHHFEDDCBA@?>>~~||{yyxwvuussqqponmmkjjhggfedcbb`__^]\[ZYYWWVUTSRRPOOMLKKJIHGFFDCBBA@?>><~~|{zzxxwvutssqqponmlkkihhgfeddcaa`^]]\[[ZXWVVUTSRQPOONMLKJIHHFEDDCBA@?>=<<~~||{zyxwwuutrrqponnlkjjhhgfedcba``^^]\[[ZYWWVUTSRQQOONMLKJIIGFEECBBA@??=<<:~}}{{zyxxvuussqqponmlkjjhhgfedccba`_^]\\ZZXXWUUTTRQPPONLLKJIHHGFEDCBA@@>>=<;:}||{zzxwwutssrqponmlljiihgfedccb``_^]][ZYYXVVUUSRRQPONMLKJIIHGFEDCBA@?>=<<;:9~}}|{zyywvvutsrqponnmljjhhhffedbba`__]\[[YYXWVUTSSQPPONMLKKJIGGFEDCBA@??>=<;:98~||{zyxwwuutsrqppnmlkkiihgffdccba`_^^\[ZYYXWVUTTSQQONNMLKJJHHGFEDCBBA@>=<<;:997~}}|{zyxwvvutsrqpponmkkjihhgfedcba`_^]][ZYYXWVUTSRQPOONMLKKIIHGFEDCBA@@?>=<<:9977~}||zyxxwvutsrqqonnmlkjihgfeddcbaa_^]]\[ZYXXVUTSSQPPOOMLKJJHHGFEECBAA??>=<;::9866~}|{zyxxvvutsrqpponmlkjiihgeeccbb`_^]\\[ZYXWVVTTRRQPOOMMLJIIHGFEDCCBA??>==<;:88765~}|{zzxwwvutsrqqponmlkkiiggeedcba`__^][[ZYXWVVUSSRQPONMMLJJIHGFFDCCBA??>=<;:9877654~}}|zzxwvvuttrrppnnmmkjihhgfddcbaa`^^\[[ZYXXVVTTSRQPONMMLKJIHGFEDDCB@@?>==<::9876543~}|{{yyxwvutssqpoonmlkkjiggfedcbb``_^][[ZZYWWUTTSRQPONMMKKJIIGGFDDCB@??>>=<::88765433~}}{{zyxwvutssqqponmlljihhgfedccb`_^^]\[ZYYWVVUTSRQQONMMLKJIHGFEDDCB@@??=<;::977654432~}|{{yyxwwvttrrqpoomlljjhhffeecba``_^]\[[YYXWVTTSRRPOOMLLKJIHGGEDDCBA@??>=;;99876644321}||{zyxwvutssqqpoonlljjihgfedcbb``_^]\[ZZYXWVUTSSQQOONLLKJIHHFEDDCBB@@?>=<:998776443210~}}{{zyxwvvusrrqpoomlkkjhhgfeeccba`_^]\\ZZXXWVUTTRRQPONMLKJIHHFFEDCBA@??><<::98866543210/~}}|{zyxwvutssrqpoonmlkjihgfeddcaa`_^]][ZYYXWVUTSRRQPONMLLJIHHFFEDCBA@@?>=<;:98765543210//~}|{zyywwvttsrqppnnmlkjihgfeddcaa`__]\[ZZYWWWUTSRQPPONMLKJIIHGFEDCBAA?>><<;:98865543210//.~}|{zzxxwvttsrrqpnmmlkjiigffecbba`_^]]\[ZYXWVVTTRRQPONMMKJIHGGFEDCBBA?>>=<<:99876533210/.--~~}|{zyywvvutsrqppomllkjjhgfeedcba`_^^\\[ZYXWWUUSSRQPONMMKJJHHGFEDCCBA??>=<;;99876543210/.--,}}||zyywwvutsrqpponmlkjihgffeccba`__]\\[ZYXWVVUTSRPPPOMMKKJIHGFEDCBBA@?>=<;;:8765544220/..-,+~}||{yywwvutsrrqponmlkjihgfeeccba``^]\\ZZYXWVVTTRQQPONNMLKJIHGFEEDBAA@?>=<;;98875554311/..-,,*~}||{yxxwvutsrrqponmlkjihhgfedcba`_^^]\[ZYYXWUUTSRQPONMLLKJIHGGEEDCBA@?>=<<::98765533110/.-,+**~}|{{yyxvvutsrqppnmmlkjjhgfeedcbb`_^^]\[ZZXXWUTSSRQQPNNMKKJIHHGEEDCBA@?>=<<:998665433110/.-,,*)(~}}{{zxxwvuutrrpponmmkkiihgeedccba`_]]\[ZYXWWVTTSRQPOONLKKJIHGFFECCBA@?>><<;:98765543210/.-,,+)((}||{zyxwvutssrqponmmkkjihgfeeccaa_^^]\\ZZYXWVUTSRQPOOMLLKJIHHFEDCCBA@?>><<;:98765542110/.-,,+*)('~}|{yyxwvuutsrqponnlkjiihgffddbba`_^]\[ZYXWWVUTSRRPOONLLKJIIHFEEDCBAA?>==<;999776543210//--,+*(('&~}|{zyxxvuttrrqpoomllkjhhgfedccaa__^]\[[ZYWWVUTSRQQOOMMLKJIHHFFECCBAA??><<;:987654432100.--,+*(('&%~||{zyxwvuutsrqpoonmlkjhhgfedcbba`_^]\[ZZXXWVUTTSQQPNNMLKJIHGGFEDCBAA?>=<<;:98765542220//.,,**)('&&%~~}|{zyyxwvttsrqppnmmlkiiigfeedcba`__^\[[ZYXWVUTSRRPONNMLKJIHHGFDDCBA@?>>=<;:998665432110/-,,+*)((&&%$~~}{{zyxwwuttrrqpponmlkjihgfeedcba`__]\[[ZYXWVUTSSRPOONMLLJJHHGFEDCBBA??><;<:98776543210//--,**)(''&$$#~}|{zyxwwvttsrqpoommlkjihhfeddcba``_]\\[ZXXWVVTTRQQPONMLKKJIHGFEDCBAA??>=<<:99876443221/.-,,**)('&%$$#"~}|{zyywvvutsrrqoommlkjihhffedcba`_^]\\ZZXXWVVUTSRQPONMLKKJIHGFEDCCBA@>>=<<:99876543311/..-,+*))''%$$#"!~}}{zyxxwvutsrrqpnnmlkjiiggfddbba`_^]]\[ZYXWVVTTSRQPPNMMLKJIHGFEDCBA@@?>=<;;:88765433200/.-,+**((&%%$#"!!~~}{zzxwwvuussqpponmlkjjhgffddcba`_^]][[ZYXXVUTTSRQPONNMKJJIHGFFDDBAA@?>=<<;:98765533210..-,+**(('&%###"!~}}{{zyxwvvutrqqoonmlkjihhgeedcba`_^^]\[ZYXWWVUSSRQPPONMLKJIHGGEECCAA@?>><;::9776544221//.-,+*))(&&$$#"!!~}}|{zyxwvuttsqpponmmkkiigffedcbba__^]\\ZYXWWUUSSSQPOONMLKJIHGFEDDCBAA@>><<;:88765533200/.--++*((&&%$$#! ~}{{zywwvvussrqponnmkkjihgfeedcaa__^]\[ZYYWVVTTTRQPOOMMLKJIHHFEDDCBAA??=<<;:98765532210/.-,+**((&&%%#""! ~~}{{zyxxwvusrrqponnmlkiihffeddcb``^^]\[ZZXXWVUTSSQPOONMLKKIHGFEEDCBA@??==<;:99866543210/.-,,+))('&%$##!!~}}|{zyxwwvttrrqponmlljjihgfedcbaa`_^]\[[YXXWVUTTRRQONNMLKJIHGFFDDCBBA?>><<;:99765543200/.--,**)('&%$##"! ~}||{zyxwwvutrrqponmlkjjihgffddbaa`_^]\[[ZYXWVUTTRRQOOMMLLKIIHFFEDDBA@@?==<;:997654422100/-,++*)(('%$##"! ~}|{zyxxvvutsrqpoonllkjihggfecbba`_^]][ZZYXWVVUSSRQPONMLLKIIGGFEDDCBA??>=<;::87665432100.--++*)('&%$$"" ~~}|{{yxxwuutsrqqoonmljjihggfddcba`_^^\[ZYYXWVVUTSQQPONMLKKIHHGFEEDCAA@>>=<;::8776432210/.--,+))('&%%$#"! }}||zzxwvuutsrqpoonlkkjihgffecbba`__]][[ZYXWWVTTRRQPOOMLLJJIGGFFDCBBA@?>=<;::88765432100..-++*)('&%$$#"! ~}|{zzxwwvutssqqpnnmlkjihggfeccba`_^^]\[ZYXWVUUTRRPOONMLKJJIHGFFDCBBA@?>=<;:988765433110/.-,+*)('&%%$#"" ~}|{zyyxwuutsrrpponmlkjjhhffedcba``_^\[[ZYXWVVTTRQQPONNLLJJIHGFEEDBBA@?>=<;;:88655432210/.-,+*)('&&%$#"! ~}|{zyxwuvttrqqpnmmlkjjhggfedcba`_^^]\[ZYYXVUUTRRQPPNMLKJIIHHFFEDBAA@?>><<::8876543321//.-,+*))''%%$#"!! ~}||{zywwvvtsrqqoonmlkjiihgfedcba``_]]\[ZYXWWVTTSQQPPNMMKKIIHGFEECCAA@?>=<;:988765433200/--,+*)(''&%$#"! ~~||zzyxwvutssqqponnllkjhhgfedcbaa__^]\[[YXXWUTTSRQPOONMLKJIHGFEECCBA@?>><<:998765432210/.--+*)(('&%$##! ~}}|zyyxxvuutsrqponmlkjjigffeddcb`_^]]\[[YYWVVTTSRRPONNMKJJIHHFEECCBA@?>><<;:98765533210/.-,,+*(('&%$##!! ~}|~}}{~}|{z}|{{z~}|{zzy~}}|{zyx~}}|{zyxw~}}|{zyywv}}|{zyxwvv~}{{zyxwvuu~}|{zyxxwvtt~}|{zyxwwvuss~}|{zyywvvutsr~}||zyyxwvutsrr~~}|{{yxxwvutssrq~}|{zzxxwvuussqqp}|{zzxxwvutssqqoo~~||{zyxwvuutrrqpnn~}|{{zyxwvuttrrqponm~}}|{zyxwvvttsqpponml~~}|{zyxwvutssrqponmmk~~}|{zyyxwvtsrrqppnmmlk~}|{zyywwuutsrqponmmlkj~}|{{yxxvuutsrqppnmllkji~}|{zzyxvuutsrqqpnmlkkjjh~}|{{zyxvvutsrrqpnnmlkjihg~~|{zzyxwvutssrqponmlkjihgf~}|{zzxxvvutsrqpoonmlkjihggf~}|{{yxxwvuttrqqoonmlkjiiggfe}||{zyxwvuutsrqoonmmkjihggeed}}|zzyxwvvtsrqqponmlljiiggfedc~~}{{zyxwvvussrqpoommkjiiggfeecc}|{{zyxwwvutsqqpoomlkkiiggffdcba~}|{zyxwvutssrqpoonlljjihgfeeccba~~}|{zyxxvuttsrqqonnlljjihgffedbba`~}|{zyxwvvussrqppnnllkjihgfedccba`_s2 %T4j  aFCP$ 3`zyxutsrb :mmP 'Oeedca__ΰrq]wptyxwtsr` ?mlJedcba^]Ľs+t)):dbKmzwfIxwuss^ Enml We_Ddcbb`^]t !['#PKNs}||zyxwvvur] Jnmlkaggfeccbb`_]\1{'LjkK"\V !P}|{{zxxwvut[Nnmllj 5^fedcbaa`^\[  91 ~w s|{{zyxwvuutRnmlkkj@"?aa`_^^[Zm@Ki {|zzyxwvutss \mlljjihMW__^]ZY &%d }v ~ q{zyxwvuussrM YljihhgfedS; "_^]\ ZX.y'cq!YU~} NyyxwvvttsqqnHVihhgfeedcbS^]][XXl*YGETL{H~}JoxwwuutsrqpmmDRggffddbb`Y]\[ZYXXWǻ,rq  R`}|_y}|xGitpbFqpomkj@Pfe:S^_M][ZZYXWVšph0.ch{oj}|{zlponlkji<Ke@\[ZYVU÷d' K3h"qm .+{@>u}|{zyxuJ /Woomkjihg8HP+ H[[ZYXUU~}|{zyywwvutsrqppnmmlkjjhgffddcba`__]\[[ZYXWVUUS~}||zyywwvuttrqqonnmlkjihhgfeccbba_^^][[ZYXWVUTSS~}|{{zxxwvutsrrqonnmlljjigffedcba`__^\\[ZYXXVVUTSQ~}|{zzyxwvutsrrqponmlkjiigffedcbb`__]]\[ZYXWVVUSSRR~}}{zzyxwvvttsrqponmlkkiihgeeddcaa`_]]\[ZYYXVVUTSRQP}|{{zxxwvutsrqpponmlkjiihgeedcbaa`_^]\[[YXWWUUTSRQPO~}|{zyxwvutsrrqponmlkkiiggfedccba__]]\[ZZYWWVUTSRRPOO~}}|{zyxxvuttsrqponmmlkiihgfeecbba`_^^\[ZYXXWVUTSRQQPOM~||{zyxwvvutsrqponmllkjhhgfedccb``_^]\[ZZYWWVUTSRQQOONM~~||{zzxwvvttrrqppnnmlkiihggeddbba`_^]\[[YXXWVVUSRRPPONML~}|{zyywwuussrqponnllkjihgffeccba`_^]\[[ZYXWVVUTSRPPONMLK~~}|{zyxxvvutsrrponmmlkjihgffedcba`_^^\\[ZYXWVVUSSRPPONMLLJ~}|{zyxxwuutssqpoonmlkjihgfedccba`_^^\\[ZYXWVUUTSRPOONMLKKJ~~}||zyxwwvutsrqppomllkjiigffecbbb`__]][[ZYXWVVTTSRQPONMLLJJH~}||zyxwwvutssqpponmlkjihggfedcca``^]\\[ZYXWWUTTSQQQONNLKKIIH~}}{{yyxwvutsrrqonnmlljjiggfedcbb``_^]\[ZYXXWVUSSRQPONNMLKJIHG~}}{{zxxwvvttsqqpnnmlkkjihgeedcbba__^]\[ZYYWVVUTSRQPPNMLLKJIHGG~}}{zzyxwvuttrqqpoomlkkiihffedccb``_^]\\[ZYWVVUTSRQPPONMLKJIHHFE}}|{zyxwvuutsrpoonmlkkiiggfedcbba__^]\\ZYXXWVUTSRQPONNMLKJIHGFFE~}}|{zyxwvuutsrpponmllkjihgfeecbb`__^]][ZZXXWVUTSRRQPNMMLKJJIHFFED~~}{{zyxwwuutsrqpoonlkkjhhgfeedbba`_^]\[ZZXWWVUTSRQQOONMLKJIHGFFEDC~~}|{zyxwwuttsrqqoonlljjihgfeedcba`_^^\[[ZYXWVVUSSRQONNMLKJJIHFEEDDB}}|{zyxwwvussrqpoommkkjihggfeccba`_^]\\ZZYXWVUTSRRQPONMLKJIIHGFEDCBA}}|{{yxxwuttsrqpoommkkjihgffedca``_^]\\[YYXWVUTSSRPPONNLLJIIHGFEDDCB@~}|{zzxxvuttsrqqoommljjihhgfecbba`_^]\\[YXXWVUUTRRQPOOMLKKJHHFFFDCBB@@~~}|{zyywwvttsrrponmmlkjjhhgeedbba`_^]\\ZZYXWVUTTSRQPONMMKKJIHGFFDCBBA@?~}|{zzyxvuuusrqqoonllkjihggfedcba``^]]\[ZYYWVVTSSRQPOONMKKJIHGGEDCCBA@?>~}|{zyxxwvuussqqponmlkjiihgfedcba``^]]\[ZYYXWUUTSRQPPONMLKJIHGFEEDBBA??>=~}}{zzyxwvuutrrqpnmmlkjjihfeedcbb``^^]\[ZZXWWUUTSRQPOONMLJJIHGFEDDCBA@?>==~}|{{zywwvutsrrqpnnmllkiihgeedccba__]]\[[YXWVUTTSRQPONNMLKJJHGGEECCBA@?>==<~}}{{zyxwvuusrrpponmlkjjhhgfedcbba`_^]\[ZYYXWVUTSRQPPOMMLKJIHGFFEDCBA@?>==;;~||{zyxwwvutsrpponmmljjhggfeddcb`__^]\[ZZYWVUUTSRQQPONMLKJJIGGFECBBA@@>=<;::~~||{zyxwvuussrqponmlkjjihgfedccb``_^]\[ZZXXWVUTTSRQONNMLKJIHGFEEDCBBA@>=<;;:9~}|{zyywvuttsrqponmmlkjhhgffddcba__^^\[ZYXXWVUTSRRPPONMLKJJHHGFEDCBB@??>=<;:98~}|{zyxxwuttsrqponnmlkjihhffedbb``__]\[[ZYWWVUUTSRPPONMLKJIIHGFEDCCA@??==<;:988~}|{{yywvuussrqponnllkjihggfedcba`_^]\\ZZYXWVUTTRRQPONMLLJJHHGFEECBB@@>>=<;:9876~~}|{zyyxvvutsrqpoonmljjihggeddcaa``^]\\[ZXXWVUUSSRQPONMLKKJIHGFEDCBBA@>==<<::9776~}|{zyxxwuutsrrqoonmlkjihhgfeccba`_^^][[ZYXWWUUSSRQPONMLLKJIHGFEEDBAA@?>=<;;:87665~}}|{zyxwvutsrrqoonmlkjihggeedcba`__]][[ZYXXWVUTRRQPPNMMLKJIHGFEDCCAA@?>=<<;:987554~}|{zyxxwvutsrqpponlllkjigfeedcba`__^][[ZYXXWVUSSRQPPOMLLJJIHGFEECCA@@?>=<;:99876553~}}|{zyxwvuussqqponmlkkjhhgfedcba`_^^]\[ZYXWVUUTSRQPPNNMKJJHHGFEEDCBA@?>=<;;:98765442~}||{yyxwvvtsrrpponmlljiiggfedcba``_]]\[ZYXXWVUTSRRPPNNMKKJIHGFFECCBA@??><<;:987654432}}|{zyxwwuusrrqponnlkkjihgfeddbaa__^]\[ZZYWWVUTSRQPPONMLKJIHHFEDDCBB@@>><;;:9877554320~~||{zyxwwvutsrqpoommkkiihgfedcba``^^]\[ZZXWVVUTSRQQPONMLKJJHGGEEDCBA@@>>=<;:98766433210}}|{zyxwvvutsrqponnllkiihgfedcbba`_^]\[ZYYWWVUTSRQQPNMLLLKJIHGEEDCBAA?>==<;:98876443210/~}|{zyxwvuutsrqpoomllkjhhhffedcaa`_^]\\ZZXXWVUUSRQQOOMMLLJJIHGEEDCBA@??>=<;:98765543210/.~~}|{zyxxvuutsrqqponmlkjihgfeedcba`_^]][[ZYWWVUTSSQQPONMLKKIIGGFEDCCB@??>=<;:98766542210/.-~||{zyxwwutssrqponmmlkjihggfdcbba`_^]\[[YYXWWUTSRRQPNNMLLJIHHGFEDDCBA?>==<;;:97764432100.--~}|{zyyxvvutsrqpponmlkjihgffddcaa`_^]][ZZYXWVVTSSRQPONMLKKIIHGFEDCBBA@>==<;::88665432110..-,~}|{{zxwwvutsrqqpnmmlkjiigffedbbaa_^]]\[ZYXWVUUTSRQPOOMMKJJIHGFFECBA@@?>==;;998765432100/--,+~~}||zzxxwvutsrrpponmlkjjhhfeeccca`__]]\[ZYYWVVUTRRQPONMLKJJHHGFEDDCBA@?>=<;::98665433100/.-,+*~}||{yyxwvutssrqpnnmlljiihffedcbaa_^^]\[ZYYXVVUSSRQPONMMLKJIHGFEDCBAA@?>==<:998765432100/.--+*)}}{{zyxwvuttrqqpommlkjjhggfedcba`__]]\[[YYWVUUSSRQPONNLLJJIHGFFDCCBA@?>==<::98765532210/.-,+**(~~|{zzyxwvvutrrqponnlkjjihffedcbaa__^]\\ZYXWVVTSSRQPONNLKKJIHGFEEDBBA@??>=<;998765432100/.-,+**)(~~||{zyxwvvtsrrqponnlkjihhgfedcbba__^]\\ZYYXWUUTSRQPPOMLLKJIIGFFEDCBAA?>=<;;:98865432210/.-,,*))('~}||{zyxwwutssrqponmmlkjihgfeddcba`^^]\[ZYYXVVUTSRRPONMMLKJIHGGFEDCBA@?>>=<;:99766432200/.--++))('&}|{{zyxwvvutrrpponnlkjjihgfedccba__^]][ZYXWWVUTSRQPOONMLKKIHGFEEDCBA@??><<;:99776443210//.-++))('&%~}}|zzyxwvuutsrqponmmkjjihhfeecbaa`__]\\ZYXXWVUTSSQPONNMLKJJIGFFEDDBAA@?>=;;:99776433210/.-,++*))'&&%~~}|{zyyxvuussrqponmllkjihggedccba`_^]\\[ZYWWVVUSRRPPONMLKJIHGGFEDCBA@?>=<<;;:87765432100..,++*))'&%$$~~}|{zzywvuutsrqqonnllkjihhgfddcba``^^\\ZYYXWVVTTSRPPONMLKJJIHFFEDCBBA@?><<;:987765432100..-,**)(('&$##~~}|{zyxwwvttsrqponmmlkjihgfeeccba`_^]\[[YYXWWUUTSQQPONMLKJJHHGFEDCCA@??>=<;;998754432100..-,+*)('&%$#""~}|{zyywwvuttrqppnnmlkjihgffedcba`_^]]\[YYXWVUUTSRQPONMMKJJIHGFEDCBB@@?>=<;:997765442110/.-,+*))''&%$#"!~}||zyywvuuttrqqponmlkjihhgeeccba`_^]\[[ZYXWVVUTRRPPPNNLKKJIHGFEEDBBA@?>=<<::87765442100.--,+**)''%%$#"!!~}|{zzyxwvuttrqpponllkjiigffedcbaa__^]\[ZYXWVUUTSRQPPNNLLJJIHGFFEDCBA@?>==<::97765442110/.--++))('&%$#"! ~}|{{zyxwvutssrqoonmlkkiihffddcbaa`_^][[ZYXWWUUTSRQQONNMLKJIHGGEDCCBA??>><;;:8876653210//.-,+*))''&%%##! }}{zyyxwvvtssrqponmllkihggfedcbb``_^]\[ZYYWWVUTSRQPPNMMKKJIHGFFECCBA@??>=<;:8776554221//.--+**)('%%$$#!! ~}||{zyxwvuttsrqpoomlkkiihgeedcba``_^]\[ZYXXWUUTSRRPPNNMLKJIHGFEDDCBA@?>==<;:9876643321//.--,+*(('&%$#"!!}}|{yyxwvuusrqqpoomlkkjhhgfedcbaa__]]\[[YYXWVUTSSQQONNLLKJJHGGEEDCBAA??=<<;:98865443210/.-,++*)('&%%#""! ~~||{zyxwvuussrqponmlkjjihgfeddcaa`_^]\\ZZXWWVUTSRQQONNMLKJIHHGEDDBBA@?>==<;:98766443100/..,+**)('&%$#"" ~~}|zzzyxwuutsrqponmlkkjihggeddbba__^^\[[ZYXWVUUSSQQOONMLKJIIGGFEDCCA@??>=<;:98776543210//-,,+*)(''&%$#!! ~}|{zzxwvvttsrqppnnmlkjihgfeedbaa`__]][[ZYWWVUTTRQQOONMLLKIHGGFEDCBAA??==<;:99775542210/.-,,+*)((&&$$#"! }}|{zyyxwvutrrqqonnmkkjihgfeecca``_^]\[ZZYXWVUTSSRQPNNMLLKIIHGFEDCBA@@>>=<;:98775533210//--++*)('&%%$#"! ~}|{zzxwvvutsrqqoonmkjjihggeddcba`_^]\[[ZYXWVVTSRRQPONMLKKJIHGFFDCBAA@>>=<;:997665432100.--,+*)(('%$##"! ~~}|{zyxxwuutsrqqonmllkjihgfeedcba``_^\\ZZYXWWVTTRRPPONMLLKJIHGFEDCCAA??>=<<:98775543321//.,,+*)((&&%$#"! ~}|{zyyxwvutssqqponmlkjjigffedcba``_^\\[ZYXWVUUTRQQPONNLLKJIHGFEDCBBA@?>=<;::8776544210//.-,++*)'&%%$#"!!~}|{{zxxvvutsrqpponmmkjihhgfedcbb`__]]\ZZYXXWUTSSRQPOOMMLKJIHGFEDCBAA@?>==;:99876543220//.,,++)(''&%$#"! ~~}|{yyxwvvutsrpponmlkjiihgeedcba``_^]\[ZZXXVVUSSRQPPONLKJJIHGGFDCCBA@?>><;::98765532100/.-,+*)(('&%$#"!!}}|zzywwvutsrrpoonmlljiiggfedcbba`^^]\[ZZXWWVUTSRRPOONMLKJIHGGEDDCBA@?>=<;:99776553211//.-,+**)('&%$$"! ~}}{{yyxwwuttrrqponmllkjhhgfeeccba__^]\[[ZYXVVUTSRRPPONMLKJIHGGFEDCAA@?>><;::98775443200/..,,*)(('&%$##!! ~}}~}}{~}|{z~}||{z~~||{zy}}{{zxx~|{zzyxw}|{{zxywv~}{zzyxwvv~~}|{zyxwvvt~~||{zyxxwuus~}|{{yywvvuts~}|{zyyxwvttsr~}|{zzywvvutsrq~~}|{zyyxwvutsrrq~}|{zyxxwvuttrqpo~~||{zywwvutsrrppo~~}|zzyxwvuussqqpon~~|{{zyxwwvttrrpoonn~~||{zyxwwuttsrqponmm~}||{zyxwvuussqqponmll}||{zyxwwuttrrqponmlkj~}}|{zyxwwuussrqponnmlkj}}|{zyxxwuutsrqpoonlkjji~~||{zyywwvutsrqpoomlkjjih~~}||zzxwvvutsrqpponmlkjihh~~}|{{yyxvuutsrqpoommlkjiigg~}|{{yyxwvvtsrqqpnmllkkiihgf~}}{zyxxwvutssqqponmlkjihggfd~}|{zzyxwvutsrrqponmlkkiihfeed~~}{{zyxwvuusrqqponmllkiihgfedc~}}{{yyxwvuussrqponnlljjihgfedcc~}}|{zyxwwvttsqqponmmlkjihgfedccb~~}|{zyxwvvttsrqponmmlkiihggedccba~||{zyywvvutsrqpoonmkkjihggeeccba`~~}|{zzyxwuutsrrpoommkkiihggfeccaa`_t2 %T4j  aFCQ$ 3`yxwussra :mmP 'Ofdcbb`^Ͱrq^wptyxvtsr` ?nlJedcba^^Ľs+u)*:dcKmzwfIxvvsr^ Enml Wf^Ddcba`]\s !['#PJMs~}{{zyxwvur] Inmlkbhgfedcba``\\1{'LjkK"\W !P~|{{yywwvut\Nnmlkj 5_fedcba`_^\[  91 ~w r|{{zyxwvuttRnmmlki@"?`aa__][Zm@Kj z{zzxxwvvttr \mlkjiihMX`^^]ZY &%e |v ~ qzzyxwvutssqM YkkiihgfedS; "^^]\ ZY.y'bp!YU ~} NzyxwvvussrqnHViihgfeedbbT^]\[XXl*YGESM|H}|JoxxwuttsrqpmmDRhgfeeccbaY^]\[YXXWƼ,rq  Q`}}_y}|xGhsqbFqqolkk@Ofe:S__M\\ZZYXWVšoh0.ch{oi||{zlpoolkji<Ke?[ZZYWUķd' J3h"qm .,{@>v}||zyxuJ /Woonkjiig8IP+ H\[ZYXUU}}|{{yywvvutsrrqoonmlkjihgffedcba`_^^]\[ZYXWVVTT~}|{{yyxwvutsrqpoonllkkihhgfedcba`__^\\[ZYYWVVUTR~}|{{yywvvutsrqpponmlkjihgffddcba`__^\[[ZYXWVUUTSR~}||zyyxwvuusrrpoonmmkjjhggfedcbaa__^]\[ZZXWVVUTSRQ~}||zyyxwvuttrrqoonmlkkihggfeddba`__^]\[ZYXWVUUTRRQP~~}{{zyxwvuutrqqponmlljiihgfedcbb`_^]]\[ZYXWVVUTSRQQP~~}|{zyxwvutssqqponmlkjjiggfedccba__^]\[ZYYXWVUTSSQQPN~}|{zyxwvuussrqponnmlkiihggfddbaa`_^]\[ZYYXVVUTSRRQPON~}}|zzyxxvvutsrqpoomlkkjiggfeedbaa__^]\[ZZXXVVUUTRRQPONM~~||{zyxwwuutrrqppnmlkjiihgfedcbba`_^]\[[ZYXVVVTSSQPPONML~}}|{zyxxvvttsrqponnmlkiihggfedbb``_^]][[ZYXWVVUSSQPPONMLK~~}||zyyxvvutsrqppnnllkjihgfeddcba`__]\\[YYXXVUTSRQQPONMLKK}}||zyyxwvutsrqppnnmlkjihgffedcba``_^\\[ZYXWVVUTSRPPONNLLKJ~~}|{{zxxwvutsrrpoonmkkjihhffddcba`_^]][[ZYXWVUUTSQQPONMMKJJI~}|{{zyxwuutssqqoonmlkjiigfedccbaa`^]]\[ZZYWWUTTSRQPPNMLLJJHH~}|{{yyxwvutssqppnnmmkjjiggfedcca``^]\\[ZYYWWUTTSRQQONNMKKJIHG~}|{{yyxwvutssqqoonmlkjjhggfedcbaa_^^]\[ZYXWWUUTSRQPOONMKKJIIGG~}|{{zyxwvvtssrqponnlkjihhgfedcbaa`^^]\[ZYYWVVTTSRQQOOMMLKJIIGGF~}||zyxxwvuusrqqponmlkkihhgfedccba_^^]\\[YXWVVUTSRQQOOMLLKJJIGFFE}||{zxxwvuussrqponnlkkjihgfeddbba`_^]\[ZYXXWVUTSRQPPONMLKJJIGGFED}}|{zyxwwuttsrqponnllkihhgfedcca``_^]\[ZYYXVVUTSRQPPONMLKJJIHGEDDC~~}|{{yxwwuutrrqponmmlkjihgfeddcba`__]\[ZZXXWVUUSRRPPONMLLJIHGFEEDCB~}|{zyxxvvussrqpoonmlkjihgffeccba`_^]\[ZZYXWVUTSSRQOONMLKJIIHFFEDCBB~}|{{yyxwvutsrqppnnlkkjihhffddcba`_^^\[[ZYXWWVTTSQQONNMLLKIIGGFEDCCA@~}||zyywwvutsrrqoommlkjihgffedcba`_^^]\[ZYXWVUTSSRQOONMLKJJIHGFEDDCA@@~}||zzywvvutsrrqponmkkjjiggeddbbaa`^^]\[YYXWWUUTRRQPONMMKJJIGGFEDDBA@@?~}|{zzxxwvutsrqpoonmlljjihffddcba``_^][[ZYXXVUTTSRQPONMLKKIIHGFEEDCBA@?>~}||zzxxwvuttrqqonnmlkjjhhgfddcbaa__^]\[ZYXWVVUTSRQPONNLKKIIHGFEEDCBA@?>=~}||{yxxwvutsrrqponmlkkiihffedcbb`__]]\[[YXXVVUSSRRPOONMKKJIHGFEEDBBA@?>><~~|{zzyxwvuutrqqponmlljjhggfeecbba`^]]\\[ZYWVVUTSRQPOONMLKJIHGFEEDCBA@?>>=;~}}|{yxxwvuusrrqponmlkkjhgffedccaa`_^]\[ZYYWWUUTSRQPPNMLLKJJHGFEEDCAA@@>=<<:~~}|{zyxwvuutrqqponmlkjjihgfeecbba__^]\\ZZXXWUUTSRQPONNMLKJIHGGEEDCBA@@>>=<;:~}{zzyxwvuutsqqponnmkkiihgfedcbba`_^]\[[YXXVVUTSRRPPONMLKKIHGFEDDCCA@??>=<;:9~}}{{zyyxvvussrqppnmlkjjihgfeeccba`_^]\[[ZYXVVUTSRRPPOMMLKKJIHFFEDCBA@??==<;:98}||{{zxwwvutsrqppnnmlkjihgfeedba```^]\\[ZYXWVUTTRQQOONMLLJJIHGFEDCBB@@>=<<;:988}}|{zyxxvvussrqppnmmlkjihgfeddcba`_^^][ZZYXWVUTTSRQPONMLKJIHHGFEDDBAA??==<;:9976~}|{zzxxwuttsrrpoonmlkjihhffdccba`_^]\[ZZYXWWUUSSRQPONMLLKIHHGFEDCCB@@?==<;:99876~}||{yywvvutsrqponnmlkjihhffdccba`_^^\\[ZXXXVUUTRRQPONNLKJJHHGFEDCBAA@?>=<;;:87765~}|{zzxxwvutsrrqonnmlkjjhhfeedccaa_^^][[ZYXXWVUTSQPPONMMLJJIGGFEDCBAA@?>=<;::986654~}||{zyxwvuttrrqpnnmlljjhhgeedcbaa`_]][[ZYXWWUUSSRQPONMMKJJIHGFEDCBAA@?>==<::8876554~~|{zyyxwvutssqqonnmlljjigfeedccaa`^^\\[ZYXWWVUTSRQPOOMLKJJIHGFEEDCBA@?>==;:988765432~~}{{zyxwvutsrqpponmmljiiggfedccaa`^^]\[ZYYWWUUSSRQPOONLLKJIHGFEECCBA@?>=<;;:987764322}}{{zyxwvvusrrqoonmlljiihgfeddba``_^]\[ZZYXWVUTSRRQONNLLKJIHHGEEDCBA@?>>=<;99876553210~~|{{zyxwvvutsrppoonmkkjihggeecca``^^]\[[YXXVUUTSRQPPONLLKJIHGFEECCBA@??>=<;:98765533210}}|{zyxwvvutsqqponmllkjihgfeddbb``_^]\[ZYYXWVUTSRQPPNNMLKKJHGFEEDCBB@?>=<<;:98776533210/~}|{zzxwwuttrrqqonmmlkjihgfeeccba__^]\\ZZYXWVUUSRQPPNNMLKJIHHGFEDCBAA?>>=<;:98776543211//~}||{zyywwvutsrqponnmlkjihgffedcba`__]\[[ZYXWVUTTSRQPNNMMKKIHGGEEDCBAA?>>=<;:987655432100.-~}|{zzxxwvutsrqppnnmkkjihgfedccba`__]\[[ZYXWVUTSSQQPONNMKJIIGFFEDCBB@@?>=<;:987765432200.-,~}|{{yxwwvutsrqqonnmlkjihggeddbbaa_^^\\[ZYXWWVTTSQQPONMLKJJHHFFEDCCBA@>>=<;:98866543211/.--,~}}{zyxwwvttsrrqoonllkjihgffeccba``_^][[YYYXVVUTSRQOONMLKJJIHGFEDCBB@@?>=<;;988765443100/--,+~}|{zyxwwvuttrrqoonmlkjiihgfedcbba_^]]\[ZYXWWVUSSRQPONNLKKJHHGFEDDCBA??>=<;:998665432100/.-,+*~}|{{yywwvutsrqpponmlkjihhfeedcbba`_^][[ZYXWVUTSSRQPONMMKJIIHGFEDDBBA@?>=<<;:88765533200/--,+**~}|{zyyxwvutsrqpoonmmkjiihgfedcbb`__^]\[ZYXXVVTTSRQPONNMKKJIHGFEDCCBA@?>=<<:988765432210..-,,+*(~}}|{yyxwvutsrrqponmlkkihhfeedccaa__^]\[ZYXXVVUSSRQPONMLLKJIHGGFEDBBA@?>>=;;:98765533100/..,,**)(~~||{zyxwwvttsrqpoommkjiihffeddbaa`_]]\[ZYXXWUUTSRQQOONMLJJIHHFFEDCBA@@?=<;;:98765543200/.--++*)('~~}|{zyxwvvtsrqpponmlkkiihgffdcbba`_^]\[[YXWVUUTSSQQPOMMLKJIHHFFEDCBB@@>==<::98765543210/.--,*))(''~~||{zyxwvuutsrpponmlljjihgfeedcaa__^]\[[YXXWVTTSSQQPONMLKJIHHFFEDCBA@@>=<<;:99765542200/..,++*)('&%~~}|{zyywwuttrrqponmmkjjihggeddcba`_^]][[YYXWVUTSSRPOOMMLKKJIGFFEDCBAA?>==<;:99766543210/.-,,+*)('&%$~}|{zyyxwvutsrqponnmkjjihgfeddcba``^^][[ZYXWVUTSRQQPOMMLKJIIGFFEDCBA@??=<<;:98765543210/.--++*)(''%%$}||{zyxwwvutsrqppnmllkjihhffdccba`_^^\\ZZYXWWUTSSQQPONNMKJJIHFFEDCBAA@?>=<;:988764432110.-,,+*)(''&%$#~~}|{{zyxwvutsrqppomlljjihgfeedcbaa__]\\[ZYXWVUTSRQQPONMLKJJIHGFEEDBBA@?>=<<:997765433110..-++*)(''&$##"~}||zyxxwvutssqqoommkkjihhffedcbaa_^]\\ZYYXWWUTTSRQPONMMKKJHGGFEDCBB@@?>=<;::9876543210/.--,+*))'&&%$#"!~}}|zzyxvvutsrqpoonmllkjigfeedbbaa_^^]\[ZYXWWVTTSRQPONMMKKJIHGGEDCCAA??>==;:998765432100/.-,+*))''%%##"! ~}|{{yxxwvutssrpponmlkjihggfedcbaa`^^\\[ZYXXVUTTSRQPONNMLKJIHGFEDCBBA@?>=<;;98876543221//.-,+**((&&%$#"" ~}|{{zyxwvutssrppommlkjihhfeedcbba__^\\[ZYYWVVUSSRQQONNMKKIIHGFFDCCAA@?>><;;998765432100..-,+*))(&&%$#"!! ~}|{{yyxwvutssrpponmlkjiiggfedcbba__^]\[ZZXWVUUTSRQPONNLLKJJHGFEDCCBA@@>=<;;:98765432200/.--+*)(('&%$#"! ~}|{{zxxwvutsrrpponmlkjiihffedccaa__^]\[ZYYWWVUTSRQPONMMLKJIHGGEEDCBAA??>=;;:98765433110/.-,,+*)('&%$#"! ~~||{yyxwvutssrqponmmkjiihgfeddca`__^]\[ZZXWWVTTSRQQPNNMLKJJHHGFECCBA@??>=<;:98775543210/.-,++)(('&&%$#"! }}|{zyxwwuttrrqponnlkjjihgfeddbb``_^]\[ZZYXVVUTSRQQONNMLKJIIGGFEDCBAA@>=<<;998776443200//--,+*)(''%$#"! ~}|{zyxwvvutsqqpoommlkihhggfeccba`_^]\\ZZYXWVUUSRRQPONMLKKIHHFFEDCBB@??==<;:99866533210/..-,+*)('&&$$#!!~}}|{zzyxvuttsrqponmmlkiihggeedcba`_^^\[ZZYXWVUTSSQPPONMLKJJIGFFEDCBB@?>>=<;:99775543211/..-++))('&%$##"! ~~}|{{yxwvuttsrqponmmljjihgfeddcba`_^^][[ZYXWWUTSSQQPONMLKJJHGGFEDCCAA@?==<;:988765432100.--,+*))(&%%$#"! ~~}|{zyxxwuttsrqponnmlkjiihffddcba`_^]]\ZZYXWWUTTRRQPONMMLKJIHFFEDCBAA@?><<;:99866543311//-,,+*))''%$$#"!!}}|{{yyxwvutsrqponmllkjihggeddcba`_^^]\[ZYXXWUUTRQPPONMMKKJIHGFEEDBAA@?>=<;;:9876544211//.-,+*)('&&%#""! ~}|{zzxxwvuttsqqponmlkjihgffecbba`_^^]\[ZYXWVVTSSRQPONMMKKJIHGFEDDBA@@?>==;;98776443210/..,,+**)''&$##"! ~}|{zyxwwvutsrqpoonmlkjihhffddcba``^^]\[ZYXXWVTTSQQPPNMMKJJIHGFEDDBAA@?>=<<:99876544311//.,,+*)(('%$$#"! ~}|{{yyxwvutssqqpnnmlkjihhgeedcbba`_^]\[ZYXXVVTSSQQPOONMKKJIHGFEDDBAA@?>>=<;:98765433200/.-,+**)''&%$#""! ~}|{{zxxwvutsrrqponmmkjjiggfedcba``_^]\[ZYYWVUUTSRQPPOMLLKJIIGFEEDBBA@?>=<;;998776542210/..,,+))''%%%#"! ~~|{{zyxwvuussrpponmlljiihgfeddbba`_^]\[ZYYXVVUTSRQPPOMMLKJJHGGEEDCBA@?>=<<;:98866533200/.--++))('&%$##! gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG/TRANSH01.THF0000664000175000017500000000456614020414072021524 0ustar eveneven009902L 0600135 340300003000000010420030VDR1180072FDR1020190QSR0740292QUV0670366CPS0990433CPT0570532SPR1700589BDF0500759VFF0460809 TRANSMITTAL_HEADER_FILE1000;&RECORD_ID_FIELDRTY!RID(A(3),A(2))1600;&TRANSMITTAL_HEADER_FIELDMSD!VOO!ADR!NOV!SQN!NOF!URF!EDN!DAT(A(1),A(200),A(1),I(1),I(1),I(3),A(16),I(3),A(12))1600;&DATA_SET_DESCRIPTION_FIELDNAM!STR!PRT!SWO!SWA!NEO!NEA(A(8),I(1),A(4),A(11),A(10),A(11),A(10))1000;&SECURITY_AND_RELEASE_FIELDQSS!QOD!DAT!QLE(A(1),A(1),A(12),A(200))1000;&VOLUME_UP_TO_DATENESS_FIELDSRC!DAT!SPA(A(100),A(12),A(20))1600;&TEST_PATCH_IDENTIFIER_FIELDPNM!DWV!REF!PUR!PIR!PIG!PIB(A(7),I(6),R(5),R(5),I(3),I(3),I(3))1600;&TEST_PATCH_INFORMATION_FIELDSTR!SCR(I(1),A(100))1600;&DATA_SET_PARAMETERS_FIELDNUL!NUS!NLL!NLS!NFL!NFC!PNC!PNL!COD!ROD!POR!PCB!PVB!BAD!TIF(I(6),I(6),I(6),I(6),I(3),I(3),I(6),I(6),I(1),I(1),I(1),I(1),I(1),A(12),A(1))2600;&BAND_ID_FIELD*BID!WS1!WS2(A(5),I(5),I(5))1000;&TRANSMITTAL_FILENAMES_FIELDVFF(A(51))00356 D 00055 34030010060000VDR2390006FDR0560245VTH01 11001 001017,19940101ABCDEF013ADRG-000000.50+465959.48+001000.52+48000.5000409 D 00055 34030010060000QSR2150006QUV1330221LCF01UN MILITARY SPECIFICATION ARC DIGITIZED RASTER GRAPHICS (ADRG) 022,19900222MIL-A-89007 00323 D 00075 34030010060000CPS0330006CPT1020039SPR0610141BDF0460202TPA01Black 0000000003 00000000051100051100000000400400012800012801008TESTPA01.CPHNRed 0000000000Green0000000000Blue 000000000000344 D 00130 9903001000000006000000000VFF000000052000000006VFF000000052000000058VFF000000052000000110VFF000000052000000162TFN01TRANSH01.THF TESTPA01.CPH ABCDEF01.GEN ABCDEF01.IMG gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA18/0000775000175000017500000000000014020414072020667 5ustar evenevengdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA18/ABCDEF01.GEN0000664000175000017500000000324614020414072022274 0ustar eveneven009083LE1 0900115 ! 340300003400000010450034DRF0740079DSI0470153OVI0850200GEN2400285SPR1730525BDF0530698TIM04207510000;& GENERAL_INFORMATION_FILE1000;& RECORD_ID_FIELDRTY!RID(A(3),A(2))1100;& DATA_SET_DESCRIPTION_FIELDNSH!NSV!NOZ!NOS(I(2),I(2),I(2),I(2))1000;& DATA_SET-ID_FIELDPRT!NAM(A(4),A(8))1600;& OVERVIEW_INFORMATION_FIELDSTR!ARV!BRV!LSO!PSO(I(1),I(8),I(8),A(11),A(10))1600;& GENERAL_INFORMATION_FIELDSTR!LOD!LAD!UNIloa!SWO!SWA!NWO!NWA!NEO!NEA!SEO!SEA!SCA!ZNA!PSP!IMR!ARV!BRV!LSO!PSO!TXT(I(1),R(6),R(6),I(3),A(11),A(10),A(11),A(10),A(11),A(10),A(11),A(10),I(9),I(2),R(5),A(1),I(8),I(8),A(11),A(10),A(64))1600;& DATA_SET_PARAMETERS_FIELDNUL!NUS!NLL!NLS!NFL!NFC!PNC!PNL!COD!ROD!POR!PCB!PVB!BAD!TIF(I(6),I(6),I(6),I(6),I(3),I(3),I(6),I(6),I(1),I(1),I(1),I(1),I(1),A(12),A(1))2600;& BAND_ID_FIELD*BID!WS1!WS2(A(5),I(5),I(5))2100;& TILE_INDEX_MAP_FIELD*TSI(I(5))00066 D 00051 55030010000600000DRF0000900006DSS010101010100274 D 00103 55030010000600000DSI0001300006OVI0003900019SPR0006100058BDF0004600119TIM0000600165OVV01ADRGABCDEF0130004606700046067-0000000.50+480000.5000000000012700012700000000100100012800012801008ABCDEF01.IMGYRed 0000000000Green0000000000Blue 00000000000000100454 D 00103 55030010000600000DSI0001300006GEN0021900019SPR0006100238BDF0004600299TIM0000600345GIN01ADRGABCDEF013000000000000016 0010000001800100N0040038400400384-0594436.83-86480.810 00000000012700012700000000100100012800012801008ABCDEF01.IMGYRed 0000000000Green0000000000Blue 000000000000001gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA18/ABCDEF01.IMG0000664000175000017500000014400114020414072022272 0ustar eveneven001852L 0600065 340300002000000010420020PAD0280062SCN0300090 GEO_DATA_FILE1000;&RECORD_ID_FIELDRTY!RID(A(3),A(2))1000;&PADDING_FIELDPAD(A)2000;&PIXEL_FIELD*PIX(A(1))51015 D 00088 9903001000000006000000000PAD000001769000000006SCN000049152000001775IMG01 ~}|~}|{~}||z~}||{y~}}{zyy~~||{zyx}||{zyxw~~}|{zyxwv~}}|{zyxwvu~~}{{zyxwwuu~~||{zyxwwvut~}}|{{yxxwvuts~}|{zyxxwuttsr~}||{yywvuutsrq~}|{zzyxwvutsrqq~}||{zxxwvutssqqo~}|{{yyxwvuttrqppo~}}{zyyxwvutsrrpoon}}|{zyxwwuttrrpponm~}||{zyxwwuttrqqponml}|{{yyxwvvttrrqppomll}}|{zyxxvvutsrqponmmkk~~}|{zyxxwvttsrqpoomlkjj~}|{{yxwwvutsrqqpnnmkkji~}||zzyxvuutsrqqoonmlkjih}}|{{yxxwvutsrqponnllkjihg~}}{zyxwwuuttrqqponmlkjiigg~}|{zzywwvuusrrqoonmlkjiigge~~}{zzxxwvutssqqpnmmllkihgffe}||{zxxwvuttsrqoonmlkjjhhgfed~}}|{zyxwvuutrrqponmlkkjihgfeec~}||zzyxwvutssrqponmlkjjihgfeddb}|{{zyxwwvttsrqponmlljiihggeeccb~~}{{zyxwvvtsrrqpponlljjihgfedcca`~~}|{zzywvvutsrqpoonllkiihgfedccb``~}|{zyxxwuussrqpoonlljjihgfeeccba`_ؾ躔ďɗzxwutssmlƊfddcb_^Ʒˮ񙅄xwwtsrnlddbba^]쭬뒑髏퉃xvvsrnllҀjsdcbaa]]ڴ퐊}}{zzxxwvurnmlkshgfeccbba`]\ﳲڪ}|{zzyxwvutnmlkjrfddcbaa`_\[ڐ|{{yyxwvvttnmlkjj˝ea`__^[Zᬫɨ皎~|{yyxwwuutsmmkjiiho`_^]ZY짦zyxxwvuutsqkjjhhgfef}^^]]ZX}zyxwvvttsqqoiihgfeddbav^]\[YWׯڤ茌닅}|xxwvttsrqpmmhgffedcb`k^][[ZYWW祈}|~xyqqolkkfeޤ{fe]\ZYYXWV׻穩ơ}{{{poolkjid\ZYYVUŻѳƪ졠ڇ}|{{yx{ŏonmkjiigʁ\[ZYXVT~}|{zzywvvuttrqppnnmlkjihggeddcbba`^]\\[ZYXXVUTS~}|{zzywwvutsrrqonmmlkjiigffdccba`__]]\[ZYXXVUUTS~}||{yyxvuutsrrqoommlkjiihffedcba``_^\\[ZYXWWUTTSR~~|{{zyxwvutsrqpponmlkjiiggfedccb``_^]\[ZYXWWVTTSRQ~}}{zzywwvutsrrqponmlkjjhhgfedcbb``_^]\[ZZXXVVUTSRQP~}|{zyyxwwuussrqpnnmlkkjihgeedcbb``^^]\[ZYXXVVUTSRRPO~}||{zxxwvutsrrqponmllkiiggfeecbb`__^]\[ZYYWVVUTSSRPOO~~}|{zyxwwuusrrqponmlljjiggfedccaa_^^]\[ZZYXWUUTTRQQPOM}}|zzyyxvuussqqppnnmlkjihgfeecbba`_^]\[ZZYXWVUUSRQPPONM}}|{zyxwvuutsrqponmmkkjihgffedcb```^]\\[YXXWVUTSRQPPONML~~||{zyywwuttsrqpoonmkjiihgfeeccba``_]\\[ZXXWVUTSSRQPONMML~}|{zyxxvvutsrqqpnmmlkjihgfeddcba`_^]][[YYXWVUUSRQQPONMLLK~~}|{zyxwvuutsrrqponmkkjihhffedcba`_^]\\ZZYXWVVTTRRQPONNLKJI~}||zyxxwvutsrqppnnmkkkiihgeeccbb``^^\\[YYXXVVTSRRQPONMMKJJI~}|{{yxxwvutssqqonnmlljiiggeddcbba`^]]\[ZYXWVUTSSRQPPNNMKJJIH~}||zzxxwvutssqpponmlljihggfedcbb`_^^]\[[ZXXWUTSSRQPOOMLKJJIHG~||{zyxwvuttsqqponmlkjihhffedccb`__]]\[ZYYXVUUTSRQPOONMLKIIHGF~~}{zzyxwvuusrrpponmlkjjihffeddbba`_^]\[ZYXXWUUTSRQPONNLLKJIHGGF~~||{yyxwvuutsrqponnmkjjiggfeecbba`^^]\\ZZYWWVUTSSQQOONMLKJIHGFFE~}}{{yyxxvvutsrqpoomllkjhhgfeedcba__^]\[ZYYXVUUTSRQQOONMLKJIHGFFED~}}{{zyywvuutsrqppnmmlkiihgffecbba`_^]\\ZYYWWVUTSSQPPOMMLKKIIHFFECC~}}{{zyxwvvussrqponmllkjihgfeddcb``_^]\[ZZYXWVUTSSQPPONMLKJJIHGFEDCB~~||{zzyxvvttsrqppomlljjihgfeedcba`_^^\\ZZYXWVUTSSRQPONNLKJJHHGFEDCBA~}|{zyxxvvussrqpoonmkkjihhgeddcba`_^]][[ZXXWVUTTRQQPONMMKKJIGGFEECBA@~}|{zzxwvvttsrqponmlljjjigffedcba`_^]]\[ZYXWVUUTRRQPONNLKJJHHGFEDCBAA@~}|{{yywwuttsrqqponmlkjiihffddcba`_^^]\[ZXXWWUTTSQQPONMLKJJIHGGEDCBA@@?~}}|zzyxwvuttrqqpnnmlkjjhggfedcbb`__^]\ZZYXWWVUTSRQPONMLKKJIHGGEECCBA@?>~}|{{zyxwvuttsqpoommlkjiiggfedcca`__]]\[ZYXWWUTTSRQPONNLKJIIHHFEDDCBA@?>>~~||{yyxwvuussqqponmmkjjhggfedcbb`__^]\[ZYYWWVUTSRRPOOMLKKJIHGFFDCBBA@?>><~~|{zzxxwvutssqqponmlkkihhgfeddcaa`^]]\[[ZXWVVUTSRQPOONMLKJIHHFEDDCBA@?>=<<~~||{zyxwwuutrrqponnlkjjhhgfedcba``^^]\[[ZYWWVUTSRQQOONMLKJIIGFEECBBA@??=<<:~}}{{zyxxvuussqqponmlkjjhhgfedccba`_^]\\ZZXXWUUTTRQPPONLLKJIHHGFEDCBA@@>>=<;:}||{zzxwwutssrqponmlljiihgfedccb``_^]][ZYYXVVUUSRRQPONMLKJIIHGFEDCBA@?>=<<;:9~}}|{zyywvvutsrqponnmljjhhhffedbba`__]\[[YYXWVUTSSQPPONMLKKJIGGFEDCBA@??>=<;:98~||{zyxwwuutsrqppnmlkkiihgffdccba`_^^\[ZYYXWVUTTSQQONNMLKJJHHGFEDCBBA@>=<<;:997~}}|{zyxwvvutsrqpponmkkjihhgfedcba`_^]][ZYYXWVUTSRQPOONMLKKIIHGFEDCBA@@?>=<<:9977~}||zyxxwvutsrqqonnmlkjihgfeddcbaa_^]]\[ZYXXVUTSSQPPOOMLKJJHHGFEECBAA??>=<;::9866~}|{zyxxvvutsrqpponmlkjiihgeeccbb`_^]\\[ZYXWVVTTRRQPOOMMLJIIHGFEDCCBA??>==<;:88765~}|{zzxwwvutsrqqponmlkkiiggeedcba`__^][[ZYXWVVUSSRQPONMMLJJIHGFFDCCBA??>=<;:9877654~}}|zzxwvvuttrrppnnmmkjihhgfddcbaa`^^\[[ZYXXVVTTSRQPONMMLKJIHGFEDDCB@@?>==<::9876543~}|{{yyxwvutssqpoonmlkkjiggfedcbb``_^][[ZZYWWUTTSRQPONMMKKJIIGGFDDCB@??>>=<::88765433~}}{{zyxwvutssqqponmlljihhgfedccb`_^^]\[ZYYWVVUTSRQQONMMLKJIHGFEDDCB@@??=<;::977654432~}|{{yyxwwvttrrqpoomlljjhhffeecba``_^]\[[YYXWVTTSRRPOOMLLKJIHGGEDDCBA@??>=;;99876644321}||{zyxwvutssqqpoonlljjihgfedcbb``_^]\[ZZYXWVUTSSQQOONLLKJIHHFEDDCBB@@?>=<:998776443210~}}{{zyxwvvusrrqpoomlkkjhhgfeeccba`_^]\\ZZXXWVUTTRRQPONMLKJIHHFFEDCBA@??><<::98866543210/~}}|{zyxwvutssrqpoonmlkjihgfeddcaa`_^]][ZYYXWVUTSRRQPONMLLJIHHFFEDCBA@@?>=<;:98765543210//~}|{zyywwvttsrqppnnmlkjihgfeddcaa`__]\[ZZYWWWUTSRQPPONMLKJIIHGFEDCBAA?>><<;:98865543210//.~}|{zzxxwvttsrrqpnmmlkjiigffecbba`_^]]\[ZYXWVVTTRRQPONMMKJIHGGFEDCBBA?>>=<<:99876533210/.--~~}|{zyywvvutsrqppomllkjjhgfeedcba`_^^\\[ZYXWWUUSSRQPONMMKJJHHGFEDCCBA??>=<;;99876543210/.--,}}||zyywwvutsrqpponmlkjihgffeccba`__]\\[ZYXWVVUTSRPPPOMMKKJIHGFEDCBBA@?>=<;;:8765544220/..-,+~}||{yywwvutsrrqponmlkjihgfeeccba``^]\\ZZYXWVVTTRQQPONNMLKJIHGFEEDBAA@?>=<;;98875554311/..-,,*~}||{yxxwvutsrrqponmlkjihhgfedcba`_^^]\[ZYYXWUUTSRQPONMLLKJIHGGEEDCBA@?>=<<::98765533110/.-,+**~}|{{yyxvvutsrqppnmmlkjjhgfeedcbb`_^^]\[ZZXXWUTSSRQQPNNMKKJIHHGEEDCBA@?>=<<:998665433110/.-,,*)(~}}{{zxxwvuutrrpponmmkkiihgeedccba`_]]\[ZYXWWVTTSRQPOONLKKJIHGFFECCBA@?>><<;:98765543210/.-,,+)((}||{zyxwvutssrqponmmkkjihgfeeccaa_^^]\\ZZYXWVUTSRQPOOMLLKJIHHFEDCCBA@?>><<;:98765542110/.-,,+*)('~}|{yyxwvuutsrqponnlkjiihgffddbba`_^]\[ZYXWWVUTSRRPOONLLKJIIHFEEDCBAA?>==<;999776543210//--,+*(('&~}|{zyxxvuttrrqpoomllkjhhgfedccaa__^]\[[ZYWWVUTSRQQOOMMLKJIHHFFECCBAA??><<;:987654432100.--,+*(('&%~||{zyxwvuutsrqpoonmlkjhhgfedcbba`_^]\[ZZXXWVUTTSQQPNNMLKJIHGGFEDCBAA?>=<<;:98765542220//.,,**)('&&%~~}|{zyyxwvttsrqppnmmlkiiigfeedcba`__^\[[ZYXWVUTSRRPONNMLKJIHHGFDDCBA@?>>=<;:998665432110/-,,+*)((&&%$~~}{{zyxwwuttrrqpponmlkjihgfeedcba`__]\[[ZYXWVUTSSRPOONMLLJJHHGFEDCBBA??><;<:98776543210//--,**)(''&$$#~}|{zyxwwvttsrqpoommlkjihhfeddcba``_]\\[ZXXWVVTTRQQPONMLKKJIHGFEDCBAA??>=<<:99876443221/.-,,**)('&%$$#"~}|{zyywvvutsrrqoommlkjihhffedcba`_^]\\ZZXXWVVUTSRQPONMLKKJIHGFEDCCBA@>>=<<:99876543311/..-,+*))''%$$#"!~}}{zyxxwvutsrrqpnnmlkjiiggfddbba`_^]]\[ZYXWVVTTSRQPPNMMLKJIHGFEDCBA@@?>=<;;:88765433200/.-,+**((&%%$#"!!~~}{zzxwwvuussqpponmlkjjhgffddcba`_^]][[ZYXXVUTTSRQPONNMKJJIHGFFDDBAA@?>=<<;:98765533210..-,+**(('&%###"!~}}{{zyxwvvutrqqoonmlkjihhgeedcba`_^^]\[ZYXWWVUSSRQPPONMLKJIHGGEECCAA@?>><;::9776544221//.-,+*))(&&$$#"!!~}}|{zyxwvuttsqpponmmkkiigffedcbba__^]\\ZYXWWUUSSSQPOONMLKJIHGFEDDCBAA@>><<;:88765533200/.--++*((&&%$$#! ~}{{zywwvvussrqponnmkkjihgfeedcaa__^]\[ZYYWVVTTTRQPOOMMLKJIHHFEDDCBAA??=<<;:98765532210/.-,+**((&&%%#""! ~~}{{zyxxwvusrrqponnmlkiihffeddcb``^^]\[ZZXXWVUTSSQPOONMLKKIHGFEEDCBA@??==<;:99866543210/.-,,+))('&%$##!!~}}|{zyxwwvttrrqponmlljjihgfedcbaa`_^]\[[YXXWVUTTRRQONNMLKJIHGFFDDCBBA?>><<;:99765543200/.--,**)('&%$##"! ~}||{zyxwwvutrrqponmlkjjihgffddbaa`_^]\[[ZYXWVUTTRRQOOMMLLKIIHFFEDDBA@@?==<;:997654422100/-,++*)(('%$##"! ~}|{zyxxvvutsrqpoonllkjihggfecbba`_^]][ZZYXWVVUSSRQPONMLLKIIGGFEDDCBA??>=<;::87665432100.--++*)('&%$$"" ~~}|{{yxxwuutsrqqoonmljjihggfddcba`_^^\[ZYYXWVVUTSQQPONMLKKIHHGFEEDCAA@>>=<;::8776432210/.--,+))('&%%$#"! }}||zzxwvuutsrqpoonlkkjihgffecbba`__]][[ZYXWWVTTRRQPOOMLLJJIGGFFDCBBA@?>=<;::88765432100..-++*)('&%$$#"! ~}|{zzxwwvutssqqpnnmlkjihggfeccba`_^^]\[ZYXWVUUTRRPOONMLKJJIHGFFDCBBA@?>=<;:988765433110/.-,+*)('&%%$#"" ~}|{zyyxwuutsrrpponmlkjjhhffedcba``_^\[[ZYXWVVTTRQQPONNLLJJIHGFEEDBBA@?>=<;;:88655432210/.-,+*)('&&%$#"! ~}|{zyxwuvttrqqpnmmlkjjhggfedcba`_^^]\[ZYYXVUUTRRQPPNMLKJIIHHFFEDBAA@?>><<::8876543321//.-,+*))''%%$#"!! ~}||{zywwvvtsrqqoonmlkjiihgfedcba``_]]\[ZYXWWVTTSQQPPNMMKKIIHGFEECCAA@?>=<;:988765433200/--,+*)(''&%$#"! ~~||zzyxwvutssqqponnllkjhhgfedcbaa__^]\[[YXXWUTTSRQPOONMLKJIHGFEECCBA@?>><<:998765432210/.--+*)(('&%$##! ~}}|zyyxxvuutsrqponmlkjjigffeddcb`_^]]\[[YYWVVTTSRRPONNMKJJIHHFEECCBA@?>><<;:98765533210/.-,,+*(('&%$##!! ~}|~}}{~}|{z}|{{z~}|{zzy~}}|{zyx~}}|{zyxw~}}|{zyywv}}|{zyxwvv~}{{zyxwvuu~}|{zyxxwvtt~}|{zyxwwvuss~}|{zyywvvutsr~}||zyyxwvutsrr~~}|{{yxxwvutssrq~}|{zzxxwvuussqqp}|{zzxxwvutssqqoo~~||{zyxwvuutrrqpnn~}|{{zyxwvuttrrqponm~}}|{zyxwvvttsqpponml~~}|{zyxwvutssrqponmmk~~}|{zyyxwvtsrrqppnmmlk~}|{zyywwuutsrqponmmlkj~}|{{yxxvuutsrqppnmllkji~}|{zzyxvuutsrqqpnmlkkjjh~}|{{zyxvvutsrrqpnnmlkjihg~~|{zzyxwvutssrqponmlkjihgf~}|{zzxxvvutsrqpoonmlkjihggf~}|{{yxxwvuttrqqoonmlkjiiggfe}||{zyxwvuutsrqoonmmkjihggeed}}|zzyxwvvtsrqqponmlljiiggfedc~~}{{zyxwvvussrqpoommkjiiggfeecc}|{{zyxwwvutsqqpoomlkkiiggffdcba~}|{zyxwvutssrqpoonlljjihgfeeccba~~}|{zyxxvuttsrqqonnlljjihgffedbba`~}|{zyxwvvussrqppnnllkjihgfedccba`_s2 %T4j  aFCP$ 3`zyxutsrb :mmP 'Oeedca__ΰrq]wptyxwtsr` ?mlJedcba^]Ľs+t)):dbKmzwfIxwuss^ Enml We_Ddcbb`^]t !['#PKNs}||zyxwvvur] Jnmlkaggfeccbb`_]\1{'LjkK"\V !P}|{{zxxwvut[Nnmllj 5^fedcbaa`^\[  91 ~w s|{{zyxwvuutRnmlkkj@"?aa`_^^[Zm@Ki {|zzyxwvutss \mlljjihMW__^]ZY &%d }v ~ q{zyxwvuussrM YljihhgfedS; "_^]\ ZX.y'cq!YU~} NyyxwvvttsqqnHVihhgfeedcbS^]][XXl*YGETL{H~}JoxwwuutsrqpmmDRggffddbb`Y]\[ZYXXWǻ,rq  R`}|_y}|xGitpbFqpomkj@Pfe:S^_M][ZZYXWVšph0.ch{oj}|{zlponlkji<Ke@\[ZYVU÷d' K3h"qm .+{@>u}|{zyxuJ /Woomkjihg8HP+ H[[ZYXUU~}|{zyywwvutsrqppnmmlkjjhgffddcba`__]\[[ZYXWVUUS~}||zyywwvuttrqqonnmlkjihhgfeccbba_^^][[ZYXWVUTSS~}|{{zxxwvutsrrqonnmlljjigffedcba`__^\\[ZYXXVVUTSQ~}|{zzyxwvutsrrqponmlkjiigffedcbb`__]]\[ZYXWVVUSSRR~}}{zzyxwvvttsrqponmlkkiihgeeddcaa`_]]\[ZYYXVVUTSRQP}|{{zxxwvutsrqpponmlkjiihgeedcbaa`_^]\[[YXWWUUTSRQPO~}|{zyxwvutsrrqponmlkkiiggfedccba__]]\[ZZYWWVUTSRRPOO~}}|{zyxxvuttsrqponmmlkiihgfeecbba`_^^\[ZYXXWVUTSRQQPOM~||{zyxwvvutsrqponmllkjhhgfedccb``_^]\[ZZYWWVUTSRQQOONM~~||{zzxwvvttrrqppnnmlkiihggeddbba`_^]\[[YXXWVVUSRRPPONML~}|{zyywwuussrqponnllkjihgffeccba`_^]\[[ZYXWVVUTSRPPONMLK~~}|{zyxxvvutsrrponmmlkjihgffedcba`_^^\\[ZYXWVVUSSRPPONMLLJ~}|{zyxxwuutssqpoonmlkjihgfedccba`_^^\\[ZYXWVUUTSRPOONMLKKJ~~}||zyxwwvutsrqppomllkjiigffecbbb`__]][[ZYXWVVTTSRQPONMLLJJH~}||zyxwwvutssqpponmlkjihggfedcca``^]\\[ZYXWWUTTSQQQONNLKKIIH~}}{{yyxwvutsrrqonnmlljjiggfedcbb``_^]\[ZYXXWVUSSRQPONNMLKJIHG~}}{{zxxwvvttsqqpnnmlkkjihgeedcbba__^]\[ZYYWVVUTSRQPPNMLLKJIHGG~}}{zzyxwvuttrqqpoomlkkiihffedccb``_^]\\[ZYWVVUTSRQPPONMLKJIHHFE}}|{zyxwvuutsrpoonmlkkiiggfedcbba__^]\\ZYXXWVUTSRQPONNMLKJIHGFFE~}}|{zyxwvuutsrpponmllkjihgfeecbb`__^]][ZZXXWVUTSRRQPNMMLKJJIHFFED~~}{{zyxwwuutsrqpoonlkkjhhgfeedbba`_^]\[ZZXWWVUTSRQQOONMLKJIHGFFEDC~~}|{zyxwwuttsrqqoonlljjihgfeedcba`_^^\[[ZYXWVVUSSRQONNMLKJJIHFEEDDB}}|{zyxwwvussrqpoommkkjihggfeccba`_^]\\ZZYXWVUTSRRQPONMLKJIIHGFEDCBA}}|{{yxxwuttsrqpoommkkjihgffedca``_^]\\[YYXWVUTSSRPPONNLLJIIHGFEDDCB@~}|{zzxxvuttsrqqoommljjihhgfecbba`_^]\\[YXXWVUUTRRQPOOMLKKJHHFFFDCBB@@~~}|{zyywwvttsrrponmmlkjjhhgeedbba`_^]\\ZZYXWVUTTSRQPONMMKKJIHGFFDCBBA@?~}|{zzyxvuuusrqqoonllkjihggfedcba``^]]\[ZYYWVVTSSRQPOONMKKJIHGGEDCCBA@?>~}|{zyxxwvuussqqponmlkjiihgfedcba``^]]\[ZYYXWUUTSRQPPONMLKJIHGFEEDBBA??>=~}}{zzyxwvuutrrqpnmmlkjjihfeedcbb``^^]\[ZZXWWUUTSRQPOONMLJJIHGFEDDCBA@?>==~}|{{zywwvutsrrqpnnmllkiihgeedccba__]]\[[YXWVUTTSRQPONNMLKJJHGGEECCBA@?>==<~}}{{zyxwvuusrrpponmlkjjhhgfedcbba`_^]\[ZYYXWVUTSRQPPOMMLKJIHGFFEDCBA@?>==;;~||{zyxwwvutsrpponmmljjhggfeddcb`__^]\[ZZYWVUUTSRQQPONMLKJJIGGFECBBA@@>=<;::~~||{zyxwvuussrqponmlkjjihgfedccb``_^]\[ZZXXWVUTTSRQONNMLKJIHGFEEDCBBA@>=<;;:9~}|{zyywvuttsrqponmmlkjhhgffddcba__^^\[ZYXXWVUTSRRPPONMLKJJHHGFEDCBB@??>=<;:98~}|{zyxxwuttsrqponnmlkjihhffedbb``__]\[[ZYWWVUUTSRPPONMLKJIIHGFEDCCA@??==<;:988~}|{{yywvuussrqponnllkjihggfedcba`_^]\\ZZYXWVUTTRRQPONMLLJJHHGFEECBB@@>>=<;:9876~~}|{zyyxvvutsrqpoonmljjihggeddcaa``^]\\[ZXXWVUUSSRQPONMLKKJIHGFEDCBBA@>==<<::9776~}|{zyxxwuutsrrqoonmlkjihhgfeccba`_^^][[ZYXWWUUSSRQPONMLLKJIHGFEEDBAA@?>=<;;:87665~}}|{zyxwvutsrrqoonmlkjihggeedcba`__]][[ZYXXWVUTRRQPPNMMLKJIHGFEDCCAA@?>=<<;:987554~}|{zyxxwvutsrqpponlllkjigfeedcba`__^][[ZYXXWVUSSRQPPOMLLJJIHGFEECCA@@?>=<;:99876553~}}|{zyxwvuussqqponmlkkjhhgfedcba`_^^]\[ZYXWVUUTSRQPPNNMKJJHHGFEEDCBA@?>=<;;:98765442~}||{yyxwvvtsrrpponmlljiiggfedcba``_]]\[ZYXXWVUTSRRPPNNMKKJIHGFFECCBA@??><<;:987654432}}|{zyxwwuusrrqponnlkkjihgfeddbaa__^]\[ZZYWWVUTSRQPPONMLKJIHHFEDDCBB@@>><;;:9877554320~~||{zyxwwvutsrqpoommkkiihgfedcba``^^]\[ZZXWVVUTSRQQPONMLKJJHGGEEDCBA@@>>=<;:98766433210}}|{zyxwvvutsrqponnllkiihgfedcbba`_^]\[ZYYWWVUTSRQQPNMLLLKJIHGEEDCBAA?>==<;:98876443210/~}|{zyxwvuutsrqpoomllkjhhhffedcaa`_^]\\ZZXXWVUUSRQQOOMMLLJJIHGEEDCBA@??>=<;:98765543210/.~~}|{zyxxvuutsrqqponmlkjihgfeedcba`_^]][[ZYWWVUTSSQQPONMLKKIIGGFEDCCB@??>=<;:98766542210/.-~||{zyxwwutssrqponmmlkjihggfdcbba`_^]\[[YYXWWUTSRRQPNNMLLJIHHGFEDDCBA?>==<;;:97764432100.--~}|{zyyxvvutsrqpponmlkjihgffddcaa`_^]][ZZYXWVVTSSRQPONMLKKIIHGFEDCBBA@>==<;::88665432110..-,~}|{{zxwwvutsrqqpnmmlkjiigffedbbaa_^]]\[ZYXWVUUTSRQPOOMMKJJIHGFFECBA@@?>==;;998765432100/--,+~~}||zzxxwvutsrrpponmlkjjhhfeeccca`__]]\[ZYYWVVUTRRQPONMLKJJHHGFEDDCBA@?>=<;::98665433100/.-,+*~}||{yyxwvutssrqpnnmlljiihffedcbaa_^^]\[ZYYXVVUSSRQPONMMLKJIHGFEDCBAA@?>==<:998765432100/.--+*)}}{{zyxwvuttrqqpommlkjjhggfedcba`__]]\[[YYWVUUSSRQPONNLLJJIHGFFDCCBA@?>==<::98765532210/.-,+**(~~|{zzyxwvvutrrqponnlkjjihffedcbaa__^]\\ZYXWVVTSSRQPONNLKKJIHGFEEDBBA@??>=<;998765432100/.-,+**)(~~||{zyxwvvtsrrqponnlkjihhgfedcbba__^]\\ZYYXWUUTSRQPPOMLLKJIIGFFEDCBAA?>=<;;:98865432210/.-,,*))('~}||{zyxwwutssrqponmmlkjihgfeddcba`^^]\[ZYYXVVUTSRRPONMMLKJIHGGFEDCBA@?>>=<;:99766432200/.--++))('&}|{{zyxwvvutrrpponnlkjjihgfedccba__^]][ZYXWWVUTSRQPOONMLKKIHGFEEDCBA@??><<;:99776443210//.-++))('&%~}}|zzyxwvuutsrqponmmkjjihhfeecbaa`__]\\ZYXXWVUTSSQPONNMLKJJIGFFEDDBAA@?>=;;:99776433210/.-,++*))'&&%~~}|{zyyxvuussrqponmllkjihggedccba`_^]\\[ZYWWVVUSRRPPONMLKJIHGGFEDCBA@?>=<<;;:87765432100..,++*))'&%$$~~}|{zzywvuutsrqqonnllkjihhgfddcba``^^\\ZYYXWVVTTSRPPONMLKJJIHFFEDCBBA@?><<;:987765432100..-,**)(('&$##~~}|{zyxwwvttsrqponmmlkjihgfeeccba`_^]\[[YYXWWUUTSQQPONMLKJJHHGFEDCCA@??>=<;;998754432100..-,+*)('&%$#""~}|{zyywwvuttrqppnnmlkjihgffedcba`_^]]\[YYXWVUUTSRQPONMMKJJIHGFEDCBB@@?>=<;:997765442110/.-,+*))''&%$#"!~}||zyywvuuttrqqponmlkjihhgeeccba`_^]\[[ZYXWVVUTRRPPPNNLKKJIHGFEEDBBA@?>=<<::87765442100.--,+**)''%%$#"!!~}|{zzyxwvuttrqpponllkjiigffedcbaa__^]\[ZYXWVUUTSRQPPNNLLJJIHGFFEDCBA@?>==<::97765442110/.--++))('&%$#"! ~}|{{zyxwvutssrqoonmlkkiihffddcbaa`_^][[ZYXWWUUTSRQQONNMLKJIHGGEDCCBA??>><;;:8876653210//.-,+*))''&%%##! }}{zyyxwvvtssrqponmllkihggfedcbb``_^]\[ZYYWWVUTSRQPPNMMKKJIHGFFECCBA@??>=<;:8776554221//.--+**)('%%$$#!! ~}||{zyxwvuttsrqpoomlkkiihgeedcba``_^]\[ZYXXWUUTSRRPPNNMLKJIHGFEDDCBA@?>==<;:9876643321//.--,+*(('&%$#"!!}}|{yyxwvuusrqqpoomlkkjhhgfedcbaa__]]\[[YYXWVUTSSQQONNLLKJJHGGEEDCBAA??=<<;:98865443210/.-,++*)('&%%#""! ~~||{zyxwvuussrqponmlkjjihgfeddcaa`_^]\\ZZXWWVUTSRQQONNMLKJIHHGEDDBBA@?>==<;:98766443100/..,+**)('&%$#"" ~~}|zzzyxwuutsrqponmlkkjihggeddbba__^^\[[ZYXWVUUSSQQOONMLKJIIGGFEDCCA@??>=<;:98776543210//-,,+*)(''&%$#!! ~}|{zzxwvvttsrqppnnmlkjihgfeedbaa`__]][[ZYWWVUTTRQQOONMLLKIHGGFEDCBAA??==<;:99775542210/.-,,+*)((&&$$#"! }}|{zyyxwvutrrqqonnmkkjihgfeecca``_^]\[ZZYXWVUTSSRQPNNMLLKIIHGFEDCBA@@>>=<;:98775533210//--++*)('&%%$#"! ~}|{zzxwvvutsrqqoonmkjjihggeddcba`_^]\[[ZYXWVVTSRRQPONMLKKJIHGFFDCBAA@>>=<;:997665432100.--,+*)(('%$##"! ~~}|{zyxxwuutsrqqonmllkjihgfeedcba``_^\\ZZYXWWVTTRRPPONMLLKJIHGFEDCCAA??>=<<:98775543321//.,,+*)((&&%$#"! ~}|{zyyxwvutssqqponmlkjjigffedcba``_^\\[ZYXWVUUTRQQPONNLLKJIHGFEDCBBA@?>=<;::8776544210//.-,++*)'&%%$#"!!~}|{{zxxvvutsrqpponmmkjihhgfedcbb`__]]\ZZYXXWUTSSRQPOOMMLKJIHGFEDCBAA@?>==;:99876543220//.,,++)(''&%$#"! ~~}|{yyxwvvutsrpponmlkjiihgeedcba``_^]\[ZZXXVVUSSRQPPONLKJJIHGGFDCCBA@?>><;::98765532100/.-,+*)(('&%$#"!!}}|zzywwvutsrrpoonmlljiiggfedcbba`^^]\[ZZXWWVUTSRRPOONMLKJIHGGEDDCBA@?>=<;:99776553211//.-,+**)('&%$$"! ~}}{{yyxwwuttrrqponmllkjhhgfeeccba__^]\[[ZYXVVUTSRRPPONMLKJIHGGFEDCAA@?>><;::98775443200/..,,*)(('&%$##!! ~}}~}}{~}|{z~}||{z~~||{zy}}{{zxx~|{zzyxw}|{{zxywv~}{zzyxwvv~~}|{zyxwvvt~~||{zyxxwuus~}|{{yywvvuts~}|{zyyxwvttsr~}|{zzywvvutsrq~~}|{zyyxwvutsrrq~}|{zyxxwvuttrqpo~~||{zywwvutsrrppo~~}|zzyxwvuussqqpon~~|{{zyxwwvttrrpoonn~~||{zyxwwuttsrqponmm~}||{zyxwvuussqqponmll}||{zyxwwuttrrqponmlkj~}}|{zyxwwuussrqponnmlkj}}|{zyxxwuutsrqpoonlkjji~~||{zyywwvutsrqpoomlkjjih~~}||zzxwvvutsrqpponmlkjihh~~}|{{yyxvuutsrqpoommlkjiigg~}|{{yyxwvvtsrqqpnmllkkiihgf~}}{zyxxwvutssqqponmlkjihggfd~}|{zzyxwvutsrrqponmlkkiihfeed~~}{{zyxwvuusrqqponmllkiihgfedc~}}{{yyxwvuussrqponnlljjihgfedcc~}}|{zyxwwvttsqqponmmlkjihgfedccb~~}|{zyxwvvttsrqponmmlkiihggedccba~||{zyywvvutsrqpoonmkkjihggeeccba`~~}|{zzyxwuutsrrpoommkkiihggfeccaa`_t2 %T4j  aFCQ$ 3`yxwussra :mmP 'Ofdcbb`^Ͱrq^wptyxvtsr` ?nlJedcba^^Ľs+u)*:dcKmzwfIxvvsr^ Enml Wf^Ddcba`]\s !['#PJMs~}{{zyxwvur] Inmlkbhgfedcba``\\1{'LjkK"\W !P~|{{yywwvut\Nnmlkj 5_fedcba`_^\[  91 ~w r|{{zyxwvuttRnmmlki@"?`aa__][Zm@Kj z{zzxxwvvttr \mlkjiihMX`^^]ZY &%e |v ~ qzzyxwvutssqM YkkiihgfedS; "^^]\ ZY.y'bp!YU ~} NzyxwvvussrqnHViihgfeedbbT^]\[XXl*YGESM|H}|JoxxwuttsrqpmmDRhgfeeccbaY^]\[YXXWƼ,rq  Q`}}_y}|xGhsqbFqqolkk@Ofe:S__M\\ZZYXWVšoh0.ch{oi||{zlpoolkji<Ke?[ZZYWUķd' J3h"qm .,{@>v}||zyxuJ /Woonkjiig8IP+ H\[ZYXUU}}|{{yywvvutsrrqoonmlkjihgffedcba`_^^]\[ZYXWVVTT~}|{{yyxwvutsrqpoonllkkihhgfedcba`__^\\[ZYYWVVUTR~}|{{yywvvutsrqpponmlkjihgffddcba`__^\[[ZYXWVUUTSR~}||zyyxwvuusrrpoonmmkjjhggfedcbaa__^]\[ZZXWVVUTSRQ~}||zyyxwvuttrrqoonmlkkihggfeddba`__^]\[ZYXWVUUTRRQP~~}{{zyxwvuutrqqponmlljiihgfedcbb`_^]]\[ZYXWVVUTSRQQP~~}|{zyxwvutssqqponmlkjjiggfedccba__^]\[ZYYXWVUTSSQQPN~}|{zyxwvuussrqponnmlkiihggfddbaa`_^]\[ZYYXVVUTSRRQPON~}}|zzyxxvvutsrqpoomlkkjiggfeedbaa__^]\[ZZXXVVUUTRRQPONM~~||{zyxwwuutrrqppnmlkjiihgfedcbba`_^]\[[ZYXVVVTSSQPPONML~}}|{zyxxvvttsrqponnmlkiihggfedbb``_^]][[ZYXWVVUSSQPPONMLK~~}||zyyxvvutsrqppnnllkjihgfeddcba`__]\\[YYXXVUTSRQQPONMLKK}}||zyyxwvutsrqppnnmlkjihgffedcba``_^\\[ZYXWVVUTSRPPONNLLKJ~~}|{{zxxwvutsrrpoonmkkjihhffddcba`_^]][[ZYXWVUUTSQQPONMMKJJI~}|{{zyxwuutssqqoonmlkjiigfedccbaa`^]]\[ZZYWWUTTSRQPPNMLLJJHH~}|{{yyxwvutssqppnnmmkjjiggfedcca``^]\\[ZYYWWUTTSRQQONNMKKJIHG~}|{{yyxwvutssqqoonmlkjjhggfedcbaa_^^]\[ZYXWWUUTSRQPOONMKKJIIGG~}|{{zyxwvvtssrqponnlkjihhgfedcbaa`^^]\[ZYYWVVTTSRQQOOMMLKJIIGGF~}||zyxxwvuusrqqponmlkkihhgfedccba_^^]\\[YXWVVUTSRQQOOMLLKJJIGFFE}||{zxxwvuussrqponnlkkjihgfeddbba`_^]\[ZYXXWVUTSRQPPONMLKJJIGGFED}}|{zyxwwuttsrqponnllkihhgfedcca``_^]\[ZYYXVVUTSRQPPONMLKJJIHGEDDC~~}|{{yxwwuutrrqponmmlkjihgfeddcba`__]\[ZZXXWVUUSRRPPONMLLJIHGFEEDCB~}|{zyxxvvussrqpoonmlkjihgffeccba`_^]\[ZZYXWVUTSSRQOONMLKJIIHFFEDCBB~}|{{yyxwvutsrqppnnlkkjihhffddcba`_^^\[[ZYXWWVTTSQQONNMLLKIIGGFEDCCA@~}||zyywwvutsrrqoommlkjihgffedcba`_^^]\[ZYXWVUTSSRQOONMLKJJIHGFEDDCA@@~}||zzywvvutsrrqponmkkjjiggeddbbaa`^^]\[YYXWWUUTRRQPONMMKJJIGGFEDDBA@@?~}|{zzxxwvutsrqpoonmlljjihffddcba``_^][[ZYXXVUTTSRQPONMLKKIIHGFEEDCBA@?>~}||zzxxwvuttrqqonnmlkjjhhgfddcbaa__^]\[ZYXWVVUTSRQPONNLKKIIHGFEEDCBA@?>=~}||{yxxwvutsrrqponmlkkiihffedcbb`__]]\[[YXXVVUSSRRPOONMKKJIHGFEEDBBA@?>><~~|{zzyxwvuutrqqponmlljjhggfeecbba`^]]\\[ZYWVVUTSRQPOONMLKJIHGFEEDCBA@?>>=;~}}|{yxxwvuusrrqponmlkkjhgffedccaa`_^]\[ZYYWWUUTSRQPPNMLLKJJHGFEEDCAA@@>=<<:~~}|{zyxwvuutrqqponmlkjjihgfeecbba__^]\\ZZXXWUUTSRQPONNMLKJIHGGEEDCBA@@>>=<;:~}{zzyxwvuutsqqponnmkkiihgfedcbba`_^]\[[YXXVVUTSRRPPONMLKKIHGFEDDCCA@??>=<;:9~}}{{zyyxvvussrqppnmlkjjihgfeeccba`_^]\[[ZYXVVUTSRRPPOMMLKKJIHFFEDCBA@??==<;:98}||{{zxwwvutsrqppnnmlkjihgfeedba```^]\\[ZYXWVUTTRQQOONMLLJJIHGFEDCBB@@>=<<;:988}}|{zyxxvvussrqppnmmlkjihgfeddcba`_^^][ZZYXWVUTTSRQPONMLKJIHHGFEDDBAA??==<;:9976~}|{zzxxwuttsrrpoonmlkjihhffdccba`_^]\[ZZYXWWUUSSRQPONMLLKIHHGFEDCCB@@?==<;:99876~}||{yywvvutsrqponnmlkjihhffdccba`_^^\\[ZXXXVUUTRRQPONNLKJJHHGFEDCBAA@?>=<;;:87765~}|{zzxxwvutsrrqonnmlkjjhhfeedccaa_^^][[ZYXXWVUTSQPPONMMLJJIGGFEDCBAA@?>=<;::986654~}||{zyxwvuttrrqpnnmlljjhhgeedcbaa`_]][[ZYXWWUUSSRQPONMMKJJIHGFEDCBAA@?>==<::8876554~~|{zyyxwvutssqqonnmlljjigfeedccaa`^^\\[ZYXWWVUTSRQPOOMLKJJIHGFEEDCBA@?>==;:988765432~~}{{zyxwvutsrqpponmmljiiggfedccaa`^^]\[ZYYWWUUSSRQPOONLLKJIHGFEECCBA@?>=<;;:987764322}}{{zyxwvvusrrqoonmlljiihgfeddba``_^]\[ZZYXWVUTSRRQONNLLKJIHHGEEDCBA@?>>=<;99876553210~~|{{zyxwvvutsrppoonmkkjihggeecca``^^]\[[YXXVUUTSRQPPONLLKJIHGFEECCBA@??>=<;:98765533210}}|{zyxwvvutsqqponmllkjihgfeddbb``_^]\[ZYYXWVUTSRQPPNNMLKKJHGFEEDCBB@?>=<<;:98776533210/~}|{zzxwwuttrrqqonmmlkjihgfeeccba__^]\\ZZYXWVUUSRQPPNNMLKJIHHGFEDCBAA?>>=<;:98776543211//~}||{zyywwvutsrqponnmlkjihgffedcba`__]\[[ZYXWVUTTSRQPNNMMKKIHGGEEDCBAA?>>=<;:987655432100.-~}|{zzxxwvutsrqppnnmkkjihgfedccba`__]\[[ZYXWVUTSSQQPONNMKJIIGFFEDCBB@@?>=<;:987765432200.-,~}|{{yxwwvutsrqqonnmlkjihggeddbbaa_^^\\[ZYXWWVTTSQQPONMLKJJHHFFEDCCBA@>>=<;:98866543211/.--,~}}{zyxwwvttsrrqoonllkjihgffeccba``_^][[YYYXVVUTSRQOONMLKJJIHGFEDCBB@@?>=<;;988765443100/--,+~}|{zyxwwvuttrrqoonmlkjiihgfedcbba_^]]\[ZYXWWVUSSRQPONNLKKJHHGFEDDCBA??>=<;:998665432100/.-,+*~}|{{yywwvutsrqpponmlkjihhfeedcbba`_^][[ZYXWVUTSSRQPONMMKJIIHGFEDDBBA@?>=<<;:88765533200/--,+**~}|{zyyxwvutsrqpoonmmkjiihgfedcbb`__^]\[ZYXXVVTTSRQPONNMKKJIHGFEDCCBA@?>=<<:988765432210..-,,+*(~}}|{yyxwvutsrrqponmlkkihhfeedccaa__^]\[ZYXXVVUSSRQPONMLLKJIHGGFEDBBA@?>>=;;:98765533100/..,,**)(~~||{zyxwwvttsrqpoommkjiihffeddbaa`_]]\[ZYXXWUUTSRQQOONMLJJIHHFFEDCBA@@?=<;;:98765543200/.--++*)('~~}|{zyxwvvtsrqpponmlkkiihgffdcbba`_^]\[[YXWVUUTSSQQPOMMLKJIHHFFEDCBB@@>==<::98765543210/.--,*))(''~~||{zyxwvuutsrpponmlljjihgfeedcaa__^]\[[YXXWVTTSSQQPONMLKJIHHFFEDCBA@@>=<<;:99765542200/..,++*)('&%~~}|{zyywwuttrrqponmmkjjihggeddcba`_^]][[YYXWVUTSSRPOOMMLKKJIGFFEDCBAA?>==<;:99766543210/.-,,+*)('&%$~}|{zyyxwvutsrqponnmkjjihgfeddcba``^^][[ZYXWVUTSRQQPOMMLKJIIGFFEDCBA@??=<<;:98765543210/.--++*)(''%%$}||{zyxwwvutsrqppnmllkjihhffdccba`_^^\\ZZYXWWUTSSQQPONNMKJJIHFFEDCBAA@?>=<;:988764432110.-,,+*)(''&%$#~~}|{{zyxwvutsrqppomlljjihgfeedcbaa__]\\[ZYXWVUTSRQQPONMLKJJIHGFEEDBBA@?>=<<:997765433110..-++*)(''&$##"~}||zyxxwvutssqqoommkkjihhffedcbaa_^]\\ZYYXWWUTTSRQPONMMKKJHGGFEDCBB@@?>=<;::9876543210/.--,+*))'&&%$#"!~}}|zzyxvvutsrqpoonmllkjigfeedbbaa_^^]\[ZYXWWVTTSRQPONMMKKJIHGGEDCCAA??>==;:998765432100/.-,+*))''%%##"! ~}|{{yxxwvutssrpponmlkjihggfedcbaa`^^\\[ZYXXVUTTSRQPONNMLKJIHGFEDCBBA@?>=<;;98876543221//.-,+**((&&%$#"" ~}|{{zyxwvutssrppommlkjihhfeedcbba__^\\[ZYYWVVUSSRQQONNMKKIIHGFFDCCAA@?>><;;998765432100..-,+*))(&&%$#"!! ~}|{{yyxwvutssrpponmlkjiiggfedcbba__^]\[ZZXWVUUTSRQPONNLLKJJHGFEDCCBA@@>=<;;:98765432200/.--+*)(('&%$#"! ~}|{{zxxwvutsrrpponmlkjiihffedccaa__^]\[ZYYWWVUTSRQPONMMLKJIHGGEEDCBAA??>=;;:98765433110/.-,,+*)('&%$#"! ~~||{yyxwvutssrqponmmkjiihgfeddca`__^]\[ZZXWWVTTSRQQPNNMLKJJHHGFECCBA@??>=<;:98775543210/.-,++)(('&&%$#"! }}|{zyxwwuttrrqponnlkjjihgfeddbb``_^]\[ZZYXVVUTSRQQONNMLKJIIGGFEDCBAA@>=<<;998776443200//--,+*)(''%$#"! ~}|{zyxwvvutsqqpoommlkihhggfeccba`_^]\\ZZYXWVUUSRRQPONMLKKIHHFFEDCBB@??==<;:99866533210/..-,+*)('&&$$#!!~}}|{zzyxvuttsrqponmmlkiihggeedcba`_^^\[ZZYXWVUTSSQPPONMLKJJIGFFEDCBB@?>>=<;:99775543211/..-++))('&%$##"! ~~}|{{yxwvuttsrqponmmljjihgfeddcba`_^^][[ZYXWWUTSSQQPONMLKJJHGGFEDCCAA@?==<;:988765432100.--,+*))(&%%$#"! ~~}|{zyxxwuttsrqponnmlkjiihffddcba`_^]]\ZZYXWWUTTRRQPONMMLKJIHFFEDCBAA@?><<;:99866543311//-,,+*))''%$$#"!!}}|{{yyxwvutsrqponmllkjihggeddcba`_^^]\[ZYXXWUUTRQPPONMMKKJIHGFEEDBAA@?>=<;;:9876544211//.-,+*)('&&%#""! ~}|{zzxxwvuttsqqponmlkjihgffecbba`_^^]\[ZYXWVVTSSRQPONMMKKJIHGFEDDBA@@?>==;;98776443210/..,,+**)''&$##"! ~}|{zyxwwvutsrqpoonmlkjihhffddcba``^^]\[ZYXXWVTTSQQPPNMMKJJIHGFEDDBAA@?>=<<:99876544311//.,,+*)(('%$$#"! ~}|{{yyxwvutssqqpnnmlkjihhgeedcbba`_^]\[ZYXXVVTSSQQPOONMKKJIHGFEDDBAA@?>>=<;:98765433200/.-,+**)''&%$#""! ~}|{{zxxwvutsrrqponmmkjjiggfedcba``_^]\[ZYYWVUUTSRQPPOMLLKJIIGFEEDBBA@?>=<;;998776542210/..,,+))''%%%#"! ~~|{{zyxwvuussrpponmlljiihgfeddbba`_^]\[ZYYXVVUTSRQPPOMMLKJJHGGEEDCBA@?>=<<;:98866533200/.--++))('&%$##! gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA18/README.TXT0000664000175000017500000000027114020414072022225 0ustar evenevenAdapted from data/SMALL_ADRG_ZNA9. See data/SMALL_ADRG_ZNA9/README.TXT The differences between SMALL_ADRG_ZNA9 and SMALL_ADRG_ZNA18 are the change of ZNA and the change of sign of PSO. gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA9/0000775000175000017500000000000014020414072020607 5ustar evenevengdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA9/ABCDEF01.GEN0000664000175000017500000000324614020414072022214 0ustar eveneven009083LE1 0900115 ! 340300003400000010450034DRF0740079DSI0470153OVI0850200GEN2400285SPR1730525BDF0530698TIM04207510000;& GENERAL_INFORMATION_FILE1000;& RECORD_ID_FIELDRTY!RID(A(3),A(2))1100;& DATA_SET_DESCRIPTION_FIELDNSH!NSV!NOZ!NOS(I(2),I(2),I(2),I(2))1000;& DATA_SET-ID_FIELDPRT!NAM(A(4),A(8))1600;& OVERVIEW_INFORMATION_FIELDSTR!ARV!BRV!LSO!PSO(I(1),I(8),I(8),A(11),A(10))1600;& GENERAL_INFORMATION_FIELDSTR!LOD!LAD!UNIloa!SWO!SWA!NWO!NWA!NEO!NEA!SEO!SEA!SCA!ZNA!PSP!IMR!ARV!BRV!LSO!PSO!TXT(I(1),R(6),R(6),I(3),A(11),A(10),A(11),A(10),A(11),A(10),A(11),A(10),I(9),I(2),R(5),A(1),I(8),I(8),A(11),A(10),A(64))1600;& DATA_SET_PARAMETERS_FIELDNUL!NUS!NLL!NLS!NFL!NFC!PNC!PNL!COD!ROD!POR!PCB!PVB!BAD!TIF(I(6),I(6),I(6),I(6),I(3),I(3),I(6),I(6),I(1),I(1),I(1),I(1),I(1),A(12),A(1))2600;& BAND_ID_FIELD*BID!WS1!WS2(A(5),I(5),I(5))2100;& TILE_INDEX_MAP_FIELD*TSI(I(5))00066 D 00051 55030010000600000DRF0000900006DSS010101010100274 D 00103 55030010000600000DSI0001300006OVI0003900019SPR0006100058BDF0004600119TIM0000600165OVV01ADRGABCDEF0130004606700046067-0000000.50+480000.5000000000012700012700000000100100012800012801008ABCDEF01.IMGYRed 0000000000Green0000000000Blue 00000000000000100454 D 00103 55030010000600000DSI0001300006GEN0021900019SPR0006100238BDF0004600299TIM0000600345GIN01ADRGABCDEF013000000000000016 0010000000900100N0040038400400384-0594436.83+86480.810 00000000012700012700000000100100012800012801008ABCDEF01.IMGYRed 0000000000Green0000000000Blue 000000000000001gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA9/ABCDEF01.IMG0000664000175000017500000014400114020414072022212 0ustar eveneven001852L 0600065 340300002000000010420020PAD0280062SCN0300090 GEO_DATA_FILE1000;&RECORD_ID_FIELDRTY!RID(A(3),A(2))1000;&PADDING_FIELDPAD(A)2000;&PIXEL_FIELD*PIX(A(1))51015 D 00088 9903001000000006000000000PAD000001769000000006SCN000049152000001775IMG01 ~}|~}|{~}||z~}||{y~}}{zyy~~||{zyx}||{zyxw~~}|{zyxwv~}}|{zyxwvu~~}{{zyxwwuu~~||{zyxwwvut~}}|{{yxxwvuts~}|{zyxxwuttsr~}||{yywvuutsrq~}|{zzyxwvutsrqq~}||{zxxwvutssqqo~}|{{yyxwvuttrqppo~}}{zyyxwvutsrrpoon}}|{zyxwwuttrrpponm~}||{zyxwwuttrqqponml}|{{yyxwvvttrrqppomll}}|{zyxxvvutsrqponmmkk~~}|{zyxxwvttsrqpoomlkjj~}|{{yxwwvutsrqqpnnmkkji~}||zzyxvuutsrqqoonmlkjih}}|{{yxxwvutsrqponnllkjihg~}}{zyxwwuuttrqqponmlkjiigg~}|{zzywwvuusrrqoonmlkjiigge~~}{zzxxwvutssqqpnmmllkihgffe}||{zxxwvuttsrqoonmlkjjhhgfed~}}|{zyxwvuutrrqponmlkkjihgfeec~}||zzyxwvutssrqponmlkjjihgfeddb}|{{zyxwwvttsrqponmlljiihggeeccb~~}{{zyxwvvtsrrqpponlljjihgfedcca`~~}|{zzywvvutsrqpoonllkiihgfedccb``~}|{zyxxwuussrqpoonlljjihgfeeccba`_ؾ躔ďɗzxwutssmlƊfddcb_^Ʒˮ񙅄xwwtsrnlddbba^]쭬뒑髏퉃xvvsrnllҀjsdcbaa]]ڴ퐊}}{zzxxwvurnmlkshgfeccbba`]\ﳲڪ}|{zzyxwvutnmlkjrfddcbaa`_\[ڐ|{{yyxwvvttnmlkjj˝ea`__^[Zᬫɨ皎~|{yyxwwuutsmmkjiiho`_^]ZY짦zyxxwvuutsqkjjhhgfef}^^]]ZX}zyxwvvttsqqoiihgfeddbav^]\[YWׯڤ茌닅}|xxwvttsrqpmmhgffedcb`k^][[ZYWW祈}|~xyqqolkkfeޤ{fe]\ZYYXWV׻穩ơ}{{{poolkjid\ZYYVUŻѳƪ졠ڇ}|{{yx{ŏonmkjiigʁ\[ZYXVT~}|{zzywvvuttrqppnnmlkjihggeddcbba`^]\\[ZYXXVUTS~}|{zzywwvutsrrqonmmlkjiigffdccba`__]]\[ZYXXVUUTS~}||{yyxvuutsrrqoommlkjiihffedcba``_^\\[ZYXWWUTTSR~~|{{zyxwvutsrqpponmlkjiiggfedccb``_^]\[ZYXWWVTTSRQ~}}{zzywwvutsrrqponmlkjjhhgfedcbb``_^]\[ZZXXVVUTSRQP~}|{zyyxwwuussrqpnnmlkkjihgeedcbb``^^]\[ZYXXVVUTSRRPO~}||{zxxwvutsrrqponmllkiiggfeecbb`__^]\[ZYYWVVUTSSRPOO~~}|{zyxwwuusrrqponmlljjiggfedccaa_^^]\[ZZYXWUUTTRQQPOM}}|zzyyxvuussqqppnnmlkjihgfeecbba`_^]\[ZZYXWVUUSRQPPONM}}|{zyxwvuutsrqponmmkkjihgffedcb```^]\\[YXXWVUTSRQPPONML~~||{zyywwuttsrqpoonmkjiihgfeeccba``_]\\[ZXXWVUTSSRQPONMML~}|{zyxxvvutsrqqpnmmlkjihgfeddcba`_^]][[YYXWVUUSRQQPONMLLK~~}|{zyxwvuutsrrqponmkkjihhffedcba`_^]\\ZZYXWVVTTRRQPONNLKJI~}||zyxxwvutsrqppnnmkkkiihgeeccbb``^^\\[YYXXVVTSRRQPONMMKJJI~}|{{yxxwvutssqqonnmlljiiggeddcbba`^]]\[ZYXWVUTSSRQPPNNMKJJIH~}||zzxxwvutssqpponmlljihggfedcbb`_^^]\[[ZXXWUTSSRQPOOMLKJJIHG~||{zyxwvuttsqqponmlkjihhffedccb`__]]\[ZYYXVUUTSRQPOONMLKIIHGF~~}{zzyxwvuusrrpponmlkjjihffeddbba`_^]\[ZYXXWUUTSRQPONNLLKJIHGGF~~||{yyxwvuutsrqponnmkjjiggfeecbba`^^]\\ZZYWWVUTSSQQOONMLKJIHGFFE~}}{{yyxxvvutsrqpoomllkjhhgfeedcba__^]\[ZYYXVUUTSRQQOONMLKJIHGFFED~}}{{zyywvuutsrqppnmmlkiihgffecbba`_^]\\ZYYWWVUTSSQPPOMMLKKIIHFFECC~}}{{zyxwvvussrqponmllkjihgfeddcb``_^]\[ZZYXWVUTSSQPPONMLKJJIHGFEDCB~~||{zzyxvvttsrqppomlljjihgfeedcba`_^^\\ZZYXWVUTSSRQPONNLKJJHHGFEDCBA~}|{zyxxvvussrqpoonmkkjihhgeddcba`_^]][[ZXXWVUTTRQQPONMMKKJIGGFEECBA@~}|{zzxwvvttsrqponmlljjjigffedcba`_^]]\[ZYXWVUUTRRQPONNLKJJHHGFEDCBAA@~}|{{yywwuttsrqqponmlkjiihffddcba`_^^]\[ZXXWWUTTSQQPONMLKJJIHGGEDCBA@@?~}}|zzyxwvuttrqqpnnmlkjjhggfedcbb`__^]\ZZYXWWVUTSRQPONMLKKJIHGGEECCBA@?>~}|{{zyxwvuttsqpoommlkjiiggfedcca`__]]\[ZYXWWUTTSRQPONNLKJIIHHFEDDCBA@?>>~~||{yyxwvuussqqponmmkjjhggfedcbb`__^]\[ZYYWWVUTSRRPOOMLKKJIHGFFDCBBA@?>><~~|{zzxxwvutssqqponmlkkihhgfeddcaa`^]]\[[ZXWVVUTSRQPOONMLKJIHHFEDDCBA@?>=<<~~||{zyxwwuutrrqponnlkjjhhgfedcba``^^]\[[ZYWWVUTSRQQOONMLKJIIGFEECBBA@??=<<:~}}{{zyxxvuussqqponmlkjjhhgfedccba`_^]\\ZZXXWUUTTRQPPONLLKJIHHGFEDCBA@@>>=<;:}||{zzxwwutssrqponmlljiihgfedccb``_^]][ZYYXVVUUSRRQPONMLKJIIHGFEDCBA@?>=<<;:9~}}|{zyywvvutsrqponnmljjhhhffedbba`__]\[[YYXWVUTSSQPPONMLKKJIGGFEDCBA@??>=<;:98~||{zyxwwuutsrqppnmlkkiihgffdccba`_^^\[ZYYXWVUTTSQQONNMLKJJHHGFEDCBBA@>=<<;:997~}}|{zyxwvvutsrqpponmkkjihhgfedcba`_^]][ZYYXWVUTSRQPOONMLKKIIHGFEDCBA@@?>=<<:9977~}||zyxxwvutsrqqonnmlkjihgfeddcbaa_^]]\[ZYXXVUTSSQPPOOMLKJJHHGFEECBAA??>=<;::9866~}|{zyxxvvutsrqpponmlkjiihgeeccbb`_^]\\[ZYXWVVTTRRQPOOMMLJIIHGFEDCCBA??>==<;:88765~}|{zzxwwvutsrqqponmlkkiiggeedcba`__^][[ZYXWVVUSSRQPONMMLJJIHGFFDCCBA??>=<;:9877654~}}|zzxwvvuttrrppnnmmkjihhgfddcbaa`^^\[[ZYXXVVTTSRQPONMMLKJIHGFEDDCB@@?>==<::9876543~}|{{yyxwvutssqpoonmlkkjiggfedcbb``_^][[ZZYWWUTTSRQPONMMKKJIIGGFDDCB@??>>=<::88765433~}}{{zyxwvutssqqponmlljihhgfedccb`_^^]\[ZYYWVVUTSRQQONMMLKJIHGFEDDCB@@??=<;::977654432~}|{{yyxwwvttrrqpoomlljjhhffeecba``_^]\[[YYXWVTTSRRPOOMLLKJIHGGEDDCBA@??>=;;99876644321}||{zyxwvutssqqpoonlljjihgfedcbb``_^]\[ZZYXWVUTSSQQOONLLKJIHHFEDDCBB@@?>=<:998776443210~}}{{zyxwvvusrrqpoomlkkjhhgfeeccba`_^]\\ZZXXWVUTTRRQPONMLKJIHHFFEDCBA@??><<::98866543210/~}}|{zyxwvutssrqpoonmlkjihgfeddcaa`_^]][ZYYXWVUTSRRQPONMLLJIHHFFEDCBA@@?>=<;:98765543210//~}|{zyywwvttsrqppnnmlkjihgfeddcaa`__]\[ZZYWWWUTSRQPPONMLKJIIHGFEDCBAA?>><<;:98865543210//.~}|{zzxxwvttsrrqpnmmlkjiigffecbba`_^]]\[ZYXWVVTTRRQPONMMKJIHGGFEDCBBA?>>=<<:99876533210/.--~~}|{zyywvvutsrqppomllkjjhgfeedcba`_^^\\[ZYXWWUUSSRQPONMMKJJHHGFEDCCBA??>=<;;99876543210/.--,}}||zyywwvutsrqpponmlkjihgffeccba`__]\\[ZYXWVVUTSRPPPOMMKKJIHGFEDCBBA@?>=<;;:8765544220/..-,+~}||{yywwvutsrrqponmlkjihgfeeccba``^]\\ZZYXWVVTTRQQPONNMLKJIHGFEEDBAA@?>=<;;98875554311/..-,,*~}||{yxxwvutsrrqponmlkjihhgfedcba`_^^]\[ZYYXWUUTSRQPONMLLKJIHGGEEDCBA@?>=<<::98765533110/.-,+**~}|{{yyxvvutsrqppnmmlkjjhgfeedcbb`_^^]\[ZZXXWUTSSRQQPNNMKKJIHHGEEDCBA@?>=<<:998665433110/.-,,*)(~}}{{zxxwvuutrrpponmmkkiihgeedccba`_]]\[ZYXWWVTTSRQPOONLKKJIHGFFECCBA@?>><<;:98765543210/.-,,+)((}||{zyxwvutssrqponmmkkjihgfeeccaa_^^]\\ZZYXWVUTSRQPOOMLLKJIHHFEDCCBA@?>><<;:98765542110/.-,,+*)('~}|{yyxwvuutsrqponnlkjiihgffddbba`_^]\[ZYXWWVUTSRRPOONLLKJIIHFEEDCBAA?>==<;999776543210//--,+*(('&~}|{zyxxvuttrrqpoomllkjhhgfedccaa__^]\[[ZYWWVUTSRQQOOMMLKJIHHFFECCBAA??><<;:987654432100.--,+*(('&%~||{zyxwvuutsrqpoonmlkjhhgfedcbba`_^]\[ZZXXWVUTTSQQPNNMLKJIHGGFEDCBAA?>=<<;:98765542220//.,,**)('&&%~~}|{zyyxwvttsrqppnmmlkiiigfeedcba`__^\[[ZYXWVUTSRRPONNMLKJIHHGFDDCBA@?>>=<;:998665432110/-,,+*)((&&%$~~}{{zyxwwuttrrqpponmlkjihgfeedcba`__]\[[ZYXWVUTSSRPOONMLLJJHHGFEDCBBA??><;<:98776543210//--,**)(''&$$#~}|{zyxwwvttsrqpoommlkjihhfeddcba``_]\\[ZXXWVVTTRQQPONMLKKJIHGFEDCBAA??>=<<:99876443221/.-,,**)('&%$$#"~}|{zyywvvutsrrqoommlkjihhffedcba`_^]\\ZZXXWVVUTSRQPONMLKKJIHGFEDCCBA@>>=<<:99876543311/..-,+*))''%$$#"!~}}{zyxxwvutsrrqpnnmlkjiiggfddbba`_^]]\[ZYXWVVTTSRQPPNMMLKJIHGFEDCBA@@?>=<;;:88765433200/.-,+**((&%%$#"!!~~}{zzxwwvuussqpponmlkjjhgffddcba`_^]][[ZYXXVUTTSRQPONNMKJJIHGFFDDBAA@?>=<<;:98765533210..-,+**(('&%###"!~}}{{zyxwvvutrqqoonmlkjihhgeedcba`_^^]\[ZYXWWVUSSRQPPONMLKJIHGGEECCAA@?>><;::9776544221//.-,+*))(&&$$#"!!~}}|{zyxwvuttsqpponmmkkiigffedcbba__^]\\ZYXWWUUSSSQPOONMLKJIHGFEDDCBAA@>><<;:88765533200/.--++*((&&%$$#! ~}{{zywwvvussrqponnmkkjihgfeedcaa__^]\[ZYYWVVTTTRQPOOMMLKJIHHFEDDCBAA??=<<;:98765532210/.-,+**((&&%%#""! ~~}{{zyxxwvusrrqponnmlkiihffeddcb``^^]\[ZZXXWVUTSSQPOONMLKKIHGFEEDCBA@??==<;:99866543210/.-,,+))('&%$##!!~}}|{zyxwwvttrrqponmlljjihgfedcbaa`_^]\[[YXXWVUTTRRQONNMLKJIHGFFDDCBBA?>><<;:99765543200/.--,**)('&%$##"! ~}||{zyxwwvutrrqponmlkjjihgffddbaa`_^]\[[ZYXWVUTTRRQOOMMLLKIIHFFEDDBA@@?==<;:997654422100/-,++*)(('%$##"! ~}|{zyxxvvutsrqpoonllkjihggfecbba`_^]][ZZYXWVVUSSRQPONMLLKIIGGFEDDCBA??>=<;::87665432100.--++*)('&%$$"" ~~}|{{yxxwuutsrqqoonmljjihggfddcba`_^^\[ZYYXWVVUTSQQPONMLKKIHHGFEEDCAA@>>=<;::8776432210/.--,+))('&%%$#"! }}||zzxwvuutsrqpoonlkkjihgffecbba`__]][[ZYXWWVTTRRQPOOMLLJJIGGFFDCBBA@?>=<;::88765432100..-++*)('&%$$#"! ~}|{zzxwwvutssqqpnnmlkjihggfeccba`_^^]\[ZYXWVUUTRRPOONMLKJJIHGFFDCBBA@?>=<;:988765433110/.-,+*)('&%%$#"" ~}|{zyyxwuutsrrpponmlkjjhhffedcba``_^\[[ZYXWVVTTRQQPONNLLJJIHGFEEDBBA@?>=<;;:88655432210/.-,+*)('&&%$#"! ~}|{zyxwuvttrqqpnmmlkjjhggfedcba`_^^]\[ZYYXVUUTRRQPPNMLKJIIHHFFEDBAA@?>><<::8876543321//.-,+*))''%%$#"!! ~}||{zywwvvtsrqqoonmlkjiihgfedcba``_]]\[ZYXWWVTTSQQPPNMMKKIIHGFEECCAA@?>=<;:988765433200/--,+*)(''&%$#"! ~~||zzyxwvutssqqponnllkjhhgfedcbaa__^]\[[YXXWUTTSRQPOONMLKJIHGFEECCBA@?>><<:998765432210/.--+*)(('&%$##! ~}}|zyyxxvuutsrqponmlkjjigffeddcb`_^]]\[[YYWVVTTSRRPONNMKJJIHHFEECCBA@?>><<;:98765533210/.-,,+*(('&%$##!! ~}|~}}{~}|{z}|{{z~}|{zzy~}}|{zyx~}}|{zyxw~}}|{zyywv}}|{zyxwvv~}{{zyxwvuu~}|{zyxxwvtt~}|{zyxwwvuss~}|{zyywvvutsr~}||zyyxwvutsrr~~}|{{yxxwvutssrq~}|{zzxxwvuussqqp}|{zzxxwvutssqqoo~~||{zyxwvuutrrqpnn~}|{{zyxwvuttrrqponm~}}|{zyxwvvttsqpponml~~}|{zyxwvutssrqponmmk~~}|{zyyxwvtsrrqppnmmlk~}|{zyywwuutsrqponmmlkj~}|{{yxxvuutsrqppnmllkji~}|{zzyxvuutsrqqpnmlkkjjh~}|{{zyxvvutsrrqpnnmlkjihg~~|{zzyxwvutssrqponmlkjihgf~}|{zzxxvvutsrqpoonmlkjihggf~}|{{yxxwvuttrqqoonmlkjiiggfe}||{zyxwvuutsrqoonmmkjihggeed}}|zzyxwvvtsrqqponmlljiiggfedc~~}{{zyxwvvussrqpoommkjiiggfeecc}|{{zyxwwvutsqqpoomlkkiiggffdcba~}|{zyxwvutssrqpoonlljjihgfeeccba~~}|{zyxxvuttsrqqonnlljjihgffedbba`~}|{zyxwvvussrqppnnllkjihgfedccba`_s2 %T4j  aFCP$ 3`zyxutsrb :mmP 'Oeedca__ΰrq]wptyxwtsr` ?mlJedcba^]Ľs+t)):dbKmzwfIxwuss^ Enml We_Ddcbb`^]t !['#PKNs}||zyxwvvur] Jnmlkaggfeccbb`_]\1{'LjkK"\V !P}|{{zxxwvut[Nnmllj 5^fedcbaa`^\[  91 ~w s|{{zyxwvuutRnmlkkj@"?aa`_^^[Zm@Ki {|zzyxwvutss \mlljjihMW__^]ZY &%d }v ~ q{zyxwvuussrM YljihhgfedS; "_^]\ ZX.y'cq!YU~} NyyxwvvttsqqnHVihhgfeedcbS^]][XXl*YGETL{H~}JoxwwuutsrqpmmDRggffddbb`Y]\[ZYXXWǻ,rq  R`}|_y}|xGitpbFqpomkj@Pfe:S^_M][ZZYXWVšph0.ch{oj}|{zlponlkji<Ke@\[ZYVU÷d' K3h"qm .+{@>u}|{zyxuJ /Woomkjihg8HP+ H[[ZYXUU~}|{zyywwvutsrqppnmmlkjjhgffddcba`__]\[[ZYXWVUUS~}||zyywwvuttrqqonnmlkjihhgfeccbba_^^][[ZYXWVUTSS~}|{{zxxwvutsrrqonnmlljjigffedcba`__^\\[ZYXXVVUTSQ~}|{zzyxwvutsrrqponmlkjiigffedcbb`__]]\[ZYXWVVUSSRR~}}{zzyxwvvttsrqponmlkkiihgeeddcaa`_]]\[ZYYXVVUTSRQP}|{{zxxwvutsrqpponmlkjiihgeedcbaa`_^]\[[YXWWUUTSRQPO~}|{zyxwvutsrrqponmlkkiiggfedccba__]]\[ZZYWWVUTSRRPOO~}}|{zyxxvuttsrqponmmlkiihgfeecbba`_^^\[ZYXXWVUTSRQQPOM~||{zyxwvvutsrqponmllkjhhgfedccb``_^]\[ZZYWWVUTSRQQOONM~~||{zzxwvvttrrqppnnmlkiihggeddbba`_^]\[[YXXWVVUSRRPPONML~}|{zyywwuussrqponnllkjihgffeccba`_^]\[[ZYXWVVUTSRPPONMLK~~}|{zyxxvvutsrrponmmlkjihgffedcba`_^^\\[ZYXWVVUSSRPPONMLLJ~}|{zyxxwuutssqpoonmlkjihgfedccba`_^^\\[ZYXWVUUTSRPOONMLKKJ~~}||zyxwwvutsrqppomllkjiigffecbbb`__]][[ZYXWVVTTSRQPONMLLJJH~}||zyxwwvutssqpponmlkjihggfedcca``^]\\[ZYXWWUTTSQQQONNLKKIIH~}}{{yyxwvutsrrqonnmlljjiggfedcbb``_^]\[ZYXXWVUSSRQPONNMLKJIHG~}}{{zxxwvvttsqqpnnmlkkjihgeedcbba__^]\[ZYYWVVUTSRQPPNMLLKJIHGG~}}{zzyxwvuttrqqpoomlkkiihffedccb``_^]\\[ZYWVVUTSRQPPONMLKJIHHFE}}|{zyxwvuutsrpoonmlkkiiggfedcbba__^]\\ZYXXWVUTSRQPONNMLKJIHGFFE~}}|{zyxwvuutsrpponmllkjihgfeecbb`__^]][ZZXXWVUTSRRQPNMMLKJJIHFFED~~}{{zyxwwuutsrqpoonlkkjhhgfeedbba`_^]\[ZZXWWVUTSRQQOONMLKJIHGFFEDC~~}|{zyxwwuttsrqqoonlljjihgfeedcba`_^^\[[ZYXWVVUSSRQONNMLKJJIHFEEDDB}}|{zyxwwvussrqpoommkkjihggfeccba`_^]\\ZZYXWVUTSRRQPONMLKJIIHGFEDCBA}}|{{yxxwuttsrqpoommkkjihgffedca``_^]\\[YYXWVUTSSRPPONNLLJIIHGFEDDCB@~}|{zzxxvuttsrqqoommljjihhgfecbba`_^]\\[YXXWVUUTRRQPOOMLKKJHHFFFDCBB@@~~}|{zyywwvttsrrponmmlkjjhhgeedbba`_^]\\ZZYXWVUTTSRQPONMMKKJIHGFFDCBBA@?~}|{zzyxvuuusrqqoonllkjihggfedcba``^]]\[ZYYWVVTSSRQPOONMKKJIHGGEDCCBA@?>~}|{zyxxwvuussqqponmlkjiihgfedcba``^]]\[ZYYXWUUTSRQPPONMLKJIHGFEEDBBA??>=~}}{zzyxwvuutrrqpnmmlkjjihfeedcbb``^^]\[ZZXWWUUTSRQPOONMLJJIHGFEDDCBA@?>==~}|{{zywwvutsrrqpnnmllkiihgeedccba__]]\[[YXWVUTTSRQPONNMLKJJHGGEECCBA@?>==<~}}{{zyxwvuusrrpponmlkjjhhgfedcbba`_^]\[ZYYXWVUTSRQPPOMMLKJIHGFFEDCBA@?>==;;~||{zyxwwvutsrpponmmljjhggfeddcb`__^]\[ZZYWVUUTSRQQPONMLKJJIGGFECBBA@@>=<;::~~||{zyxwvuussrqponmlkjjihgfedccb``_^]\[ZZXXWVUTTSRQONNMLKJIHGFEEDCBBA@>=<;;:9~}|{zyywvuttsrqponmmlkjhhgffddcba__^^\[ZYXXWVUTSRRPPONMLKJJHHGFEDCBB@??>=<;:98~}|{zyxxwuttsrqponnmlkjihhffedbb``__]\[[ZYWWVUUTSRPPONMLKJIIHGFEDCCA@??==<;:988~}|{{yywvuussrqponnllkjihggfedcba`_^]\\ZZYXWVUTTRRQPONMLLJJHHGFEECBB@@>>=<;:9876~~}|{zyyxvvutsrqpoonmljjihggeddcaa``^]\\[ZXXWVUUSSRQPONMLKKJIHGFEDCBBA@>==<<::9776~}|{zyxxwuutsrrqoonmlkjihhgfeccba`_^^][[ZYXWWUUSSRQPONMLLKJIHGFEEDBAA@?>=<;;:87665~}}|{zyxwvutsrrqoonmlkjihggeedcba`__]][[ZYXXWVUTRRQPPNMMLKJIHGFEDCCAA@?>=<<;:987554~}|{zyxxwvutsrqpponlllkjigfeedcba`__^][[ZYXXWVUSSRQPPOMLLJJIHGFEECCA@@?>=<;:99876553~}}|{zyxwvuussqqponmlkkjhhgfedcba`_^^]\[ZYXWVUUTSRQPPNNMKJJHHGFEEDCBA@?>=<;;:98765442~}||{yyxwvvtsrrpponmlljiiggfedcba``_]]\[ZYXXWVUTSRRPPNNMKKJIHGFFECCBA@??><<;:987654432}}|{zyxwwuusrrqponnlkkjihgfeddbaa__^]\[ZZYWWVUTSRQPPONMLKJIHHFEDDCBB@@>><;;:9877554320~~||{zyxwwvutsrqpoommkkiihgfedcba``^^]\[ZZXWVVUTSRQQPONMLKJJHGGEEDCBA@@>>=<;:98766433210}}|{zyxwvvutsrqponnllkiihgfedcbba`_^]\[ZYYWWVUTSRQQPNMLLLKJIHGEEDCBAA?>==<;:98876443210/~}|{zyxwvuutsrqpoomllkjhhhffedcaa`_^]\\ZZXXWVUUSRQQOOMMLLJJIHGEEDCBA@??>=<;:98765543210/.~~}|{zyxxvuutsrqqponmlkjihgfeedcba`_^]][[ZYWWVUTSSQQPONMLKKIIGGFEDCCB@??>=<;:98766542210/.-~||{zyxwwutssrqponmmlkjihggfdcbba`_^]\[[YYXWWUTSRRQPNNMLLJIHHGFEDDCBA?>==<;;:97764432100.--~}|{zyyxvvutsrqpponmlkjihgffddcaa`_^]][ZZYXWVVTSSRQPONMLKKIIHGFEDCBBA@>==<;::88665432110..-,~}|{{zxwwvutsrqqpnmmlkjiigffedbbaa_^]]\[ZYXWVUUTSRQPOOMMKJJIHGFFECBA@@?>==;;998765432100/--,+~~}||zzxxwvutsrrpponmlkjjhhfeeccca`__]]\[ZYYWVVUTRRQPONMLKJJHHGFEDDCBA@?>=<;::98665433100/.-,+*~}||{yyxwvutssrqpnnmlljiihffedcbaa_^^]\[ZYYXVVUSSRQPONMMLKJIHGFEDCBAA@?>==<:998765432100/.--+*)}}{{zyxwvuttrqqpommlkjjhggfedcba`__]]\[[YYWVUUSSRQPONNLLJJIHGFFDCCBA@?>==<::98765532210/.-,+**(~~|{zzyxwvvutrrqponnlkjjihffedcbaa__^]\\ZYXWVVTSSRQPONNLKKJIHGFEEDBBA@??>=<;998765432100/.-,+**)(~~||{zyxwvvtsrrqponnlkjihhgfedcbba__^]\\ZYYXWUUTSRQPPOMLLKJIIGFFEDCBAA?>=<;;:98865432210/.-,,*))('~}||{zyxwwutssrqponmmlkjihgfeddcba`^^]\[ZYYXVVUTSRRPONMMLKJIHGGFEDCBA@?>>=<;:99766432200/.--++))('&}|{{zyxwvvutrrpponnlkjjihgfedccba__^]][ZYXWWVUTSRQPOONMLKKIHGFEEDCBA@??><<;:99776443210//.-++))('&%~}}|zzyxwvuutsrqponmmkjjihhfeecbaa`__]\\ZYXXWVUTSSQPONNMLKJJIGFFEDDBAA@?>=;;:99776433210/.-,++*))'&&%~~}|{zyyxvuussrqponmllkjihggedccba`_^]\\[ZYWWVVUSRRPPONMLKJIHGGFEDCBA@?>=<<;;:87765432100..,++*))'&%$$~~}|{zzywvuutsrqqonnllkjihhgfddcba``^^\\ZYYXWVVTTSRPPONMLKJJIHFFEDCBBA@?><<;:987765432100..-,**)(('&$##~~}|{zyxwwvttsrqponmmlkjihgfeeccba`_^]\[[YYXWWUUTSQQPONMLKJJHHGFEDCCA@??>=<;;998754432100..-,+*)('&%$#""~}|{zyywwvuttrqppnnmlkjihgffedcba`_^]]\[YYXWVUUTSRQPONMMKJJIHGFEDCBB@@?>=<;:997765442110/.-,+*))''&%$#"!~}||zyywvuuttrqqponmlkjihhgeeccba`_^]\[[ZYXWVVUTRRPPPNNLKKJIHGFEEDBBA@?>=<<::87765442100.--,+**)''%%$#"!!~}|{zzyxwvuttrqpponllkjiigffedcbaa__^]\[ZYXWVUUTSRQPPNNLLJJIHGFFEDCBA@?>==<::97765442110/.--++))('&%$#"! ~}|{{zyxwvutssrqoonmlkkiihffddcbaa`_^][[ZYXWWUUTSRQQONNMLKJIHGGEDCCBA??>><;;:8876653210//.-,+*))''&%%##! }}{zyyxwvvtssrqponmllkihggfedcbb``_^]\[ZYYWWVUTSRQPPNMMKKJIHGFFECCBA@??>=<;:8776554221//.--+**)('%%$$#!! ~}||{zyxwvuttsrqpoomlkkiihgeedcba``_^]\[ZYXXWUUTSRRPPNNMLKJIHGFEDDCBA@?>==<;:9876643321//.--,+*(('&%$#"!!}}|{yyxwvuusrqqpoomlkkjhhgfedcbaa__]]\[[YYXWVUTSSQQONNLLKJJHGGEEDCBAA??=<<;:98865443210/.-,++*)('&%%#""! ~~||{zyxwvuussrqponmlkjjihgfeddcaa`_^]\\ZZXWWVUTSRQQONNMLKJIHHGEDDBBA@?>==<;:98766443100/..,+**)('&%$#"" ~~}|zzzyxwuutsrqponmlkkjihggeddbba__^^\[[ZYXWVUUSSQQOONMLKJIIGGFEDCCA@??>=<;:98776543210//-,,+*)(''&%$#!! ~}|{zzxwvvttsrqppnnmlkjihgfeedbaa`__]][[ZYWWVUTTRQQOONMLLKIHGGFEDCBAA??==<;:99775542210/.-,,+*)((&&$$#"! }}|{zyyxwvutrrqqonnmkkjihgfeecca``_^]\[ZZYXWVUTSSRQPNNMLLKIIHGFEDCBA@@>>=<;:98775533210//--++*)('&%%$#"! ~}|{zzxwvvutsrqqoonmkjjihggeddcba`_^]\[[ZYXWVVTSRRQPONMLKKJIHGFFDCBAA@>>=<;:997665432100.--,+*)(('%$##"! ~~}|{zyxxwuutsrqqonmllkjihgfeedcba``_^\\ZZYXWWVTTRRPPONMLLKJIHGFEDCCAA??>=<<:98775543321//.,,+*)((&&%$#"! ~}|{zyyxwvutssqqponmlkjjigffedcba``_^\\[ZYXWVUUTRQQPONNLLKJIHGFEDCBBA@?>=<;::8776544210//.-,++*)'&%%$#"!!~}|{{zxxvvutsrqpponmmkjihhgfedcbb`__]]\ZZYXXWUTSSRQPOOMMLKJIHGFEDCBAA@?>==;:99876543220//.,,++)(''&%$#"! ~~}|{yyxwvvutsrpponmlkjiihgeedcba``_^]\[ZZXXVVUSSRQPPONLKJJIHGGFDCCBA@?>><;::98765532100/.-,+*)(('&%$#"!!}}|zzywwvutsrrpoonmlljiiggfedcbba`^^]\[ZZXWWVUTSRRPOONMLKJIHGGEDDCBA@?>=<;:99776553211//.-,+**)('&%$$"! ~}}{{yyxwwuttrrqponmllkjhhgfeeccba__^]\[[ZYXVVUTSRRPPONMLKJIHGGFEDCAA@?>><;::98775443200/..,,*)(('&%$##!! ~}}~}}{~}|{z~}||{z~~||{zy}}{{zxx~|{zzyxw}|{{zxywv~}{zzyxwvv~~}|{zyxwvvt~~||{zyxxwuus~}|{{yywvvuts~}|{zyyxwvttsr~}|{zzywvvutsrq~~}|{zyyxwvutsrrq~}|{zyxxwvuttrqpo~~||{zywwvutsrrppo~~}|zzyxwvuussqqpon~~|{{zyxwwvttrrpoonn~~||{zyxwwuttsrqponmm~}||{zyxwvuussqqponmll}||{zyxwwuttrrqponmlkj~}}|{zyxwwuussrqponnmlkj}}|{zyxxwuutsrqpoonlkjji~~||{zyywwvutsrqpoomlkjjih~~}||zzxwvvutsrqpponmlkjihh~~}|{{yyxvuutsrqpoommlkjiigg~}|{{yyxwvvtsrqqpnmllkkiihgf~}}{zyxxwvutssqqponmlkjihggfd~}|{zzyxwvutsrrqponmlkkiihfeed~~}{{zyxwvuusrqqponmllkiihgfedc~}}{{yyxwvuussrqponnlljjihgfedcc~}}|{zyxwwvttsqqponmmlkjihgfedccb~~}|{zyxwvvttsrqponmmlkiihggedccba~||{zyywvvutsrqpoonmkkjihggeeccba`~~}|{zzyxwuutsrrpoommkkiihggfeccaa`_t2 %T4j  aFCQ$ 3`yxwussra :mmP 'Ofdcbb`^Ͱrq^wptyxvtsr` ?nlJedcba^^Ľs+u)*:dcKmzwfIxvvsr^ Enml Wf^Ddcba`]\s !['#PJMs~}{{zyxwvur] Inmlkbhgfedcba``\\1{'LjkK"\W !P~|{{yywwvut\Nnmlkj 5_fedcba`_^\[  91 ~w r|{{zyxwvuttRnmmlki@"?`aa__][Zm@Kj z{zzxxwvvttr \mlkjiihMX`^^]ZY &%e |v ~ qzzyxwvutssqM YkkiihgfedS; "^^]\ ZY.y'bp!YU ~} NzyxwvvussrqnHViihgfeedbbT^]\[XXl*YGESM|H}|JoxxwuttsrqpmmDRhgfeeccbaY^]\[YXXWƼ,rq  Q`}}_y}|xGhsqbFqqolkk@Ofe:S__M\\ZZYXWVšoh0.ch{oi||{zlpoolkji<Ke?[ZZYWUķd' J3h"qm .,{@>v}||zyxuJ /Woonkjiig8IP+ H\[ZYXUU}}|{{yywvvutsrrqoonmlkjihgffedcba`_^^]\[ZYXWVVTT~}|{{yyxwvutsrqpoonllkkihhgfedcba`__^\\[ZYYWVVUTR~}|{{yywvvutsrqpponmlkjihgffddcba`__^\[[ZYXWVUUTSR~}||zyyxwvuusrrpoonmmkjjhggfedcbaa__^]\[ZZXWVVUTSRQ~}||zyyxwvuttrrqoonmlkkihggfeddba`__^]\[ZYXWVUUTRRQP~~}{{zyxwvuutrqqponmlljiihgfedcbb`_^]]\[ZYXWVVUTSRQQP~~}|{zyxwvutssqqponmlkjjiggfedccba__^]\[ZYYXWVUTSSQQPN~}|{zyxwvuussrqponnmlkiihggfddbaa`_^]\[ZYYXVVUTSRRQPON~}}|zzyxxvvutsrqpoomlkkjiggfeedbaa__^]\[ZZXXVVUUTRRQPONM~~||{zyxwwuutrrqppnmlkjiihgfedcbba`_^]\[[ZYXVVVTSSQPPONML~}}|{zyxxvvttsrqponnmlkiihggfedbb``_^]][[ZYXWVVUSSQPPONMLK~~}||zyyxvvutsrqppnnllkjihgfeddcba`__]\\[YYXXVUTSRQQPONMLKK}}||zyyxwvutsrqppnnmlkjihgffedcba``_^\\[ZYXWVVUTSRPPONNLLKJ~~}|{{zxxwvutsrrpoonmkkjihhffddcba`_^]][[ZYXWVUUTSQQPONMMKJJI~}|{{zyxwuutssqqoonmlkjiigfedccbaa`^]]\[ZZYWWUTTSRQPPNMLLJJHH~}|{{yyxwvutssqppnnmmkjjiggfedcca``^]\\[ZYYWWUTTSRQQONNMKKJIHG~}|{{yyxwvutssqqoonmlkjjhggfedcbaa_^^]\[ZYXWWUUTSRQPOONMKKJIIGG~}|{{zyxwvvtssrqponnlkjihhgfedcbaa`^^]\[ZYYWVVTTSRQQOOMMLKJIIGGF~}||zyxxwvuusrqqponmlkkihhgfedccba_^^]\\[YXWVVUTSRQQOOMLLKJJIGFFE}||{zxxwvuussrqponnlkkjihgfeddbba`_^]\[ZYXXWVUTSRQPPONMLKJJIGGFED}}|{zyxwwuttsrqponnllkihhgfedcca``_^]\[ZYYXVVUTSRQPPONMLKJJIHGEDDC~~}|{{yxwwuutrrqponmmlkjihgfeddcba`__]\[ZZXXWVUUSRRPPONMLLJIHGFEEDCB~}|{zyxxvvussrqpoonmlkjihgffeccba`_^]\[ZZYXWVUTSSRQOONMLKJIIHFFEDCBB~}|{{yyxwvutsrqppnnlkkjihhffddcba`_^^\[[ZYXWWVTTSQQONNMLLKIIGGFEDCCA@~}||zyywwvutsrrqoommlkjihgffedcba`_^^]\[ZYXWVUTSSRQOONMLKJJIHGFEDDCA@@~}||zzywvvutsrrqponmkkjjiggeddbbaa`^^]\[YYXWWUUTRRQPONMMKJJIGGFEDDBA@@?~}|{zzxxwvutsrqpoonmlljjihffddcba``_^][[ZYXXVUTTSRQPONMLKKIIHGFEEDCBA@?>~}||zzxxwvuttrqqonnmlkjjhhgfddcbaa__^]\[ZYXWVVUTSRQPONNLKKIIHGFEEDCBA@?>=~}||{yxxwvutsrrqponmlkkiihffedcbb`__]]\[[YXXVVUSSRRPOONMKKJIHGFEEDBBA@?>><~~|{zzyxwvuutrqqponmlljjhggfeecbba`^]]\\[ZYWVVUTSRQPOONMLKJIHGFEEDCBA@?>>=;~}}|{yxxwvuusrrqponmlkkjhgffedccaa`_^]\[ZYYWWUUTSRQPPNMLLKJJHGFEEDCAA@@>=<<:~~}|{zyxwvuutrqqponmlkjjihgfeecbba__^]\\ZZXXWUUTSRQPONNMLKJIHGGEEDCBA@@>>=<;:~}{zzyxwvuutsqqponnmkkiihgfedcbba`_^]\[[YXXVVUTSRRPPONMLKKIHGFEDDCCA@??>=<;:9~}}{{zyyxvvussrqppnmlkjjihgfeeccba`_^]\[[ZYXVVUTSRRPPOMMLKKJIHFFEDCBA@??==<;:98}||{{zxwwvutsrqppnnmlkjihgfeedba```^]\\[ZYXWVUTTRQQOONMLLJJIHGFEDCBB@@>=<<;:988}}|{zyxxvvussrqppnmmlkjihgfeddcba`_^^][ZZYXWVUTTSRQPONMLKJIHHGFEDDBAA??==<;:9976~}|{zzxxwuttsrrpoonmlkjihhffdccba`_^]\[ZZYXWWUUSSRQPONMLLKIHHGFEDCCB@@?==<;:99876~}||{yywvvutsrqponnmlkjihhffdccba`_^^\\[ZXXXVUUTRRQPONNLKJJHHGFEDCBAA@?>=<;;:87765~}|{zzxxwvutsrrqonnmlkjjhhfeedccaa_^^][[ZYXXWVUTSQPPONMMLJJIGGFEDCBAA@?>=<;::986654~}||{zyxwvuttrrqpnnmlljjhhgeedcbaa`_]][[ZYXWWUUSSRQPONMMKJJIHGFEDCBAA@?>==<::8876554~~|{zyyxwvutssqqonnmlljjigfeedccaa`^^\\[ZYXWWVUTSRQPOOMLKJJIHGFEEDCBA@?>==;:988765432~~}{{zyxwvutsrqpponmmljiiggfedccaa`^^]\[ZYYWWUUSSRQPOONLLKJIHGFEECCBA@?>=<;;:987764322}}{{zyxwvvusrrqoonmlljiihgfeddba``_^]\[ZZYXWVUTSRRQONNLLKJIHHGEEDCBA@?>>=<;99876553210~~|{{zyxwvvutsrppoonmkkjihggeecca``^^]\[[YXXVUUTSRQPPONLLKJIHGFEECCBA@??>=<;:98765533210}}|{zyxwvvutsqqponmllkjihgfeddbb``_^]\[ZYYXWVUTSRQPPNNMLKKJHGFEEDCBB@?>=<<;:98776533210/~}|{zzxwwuttrrqqonmmlkjihgfeeccba__^]\\ZZYXWVUUSRQPPNNMLKJIHHGFEDCBAA?>>=<;:98776543211//~}||{zyywwvutsrqponnmlkjihgffedcba`__]\[[ZYXWVUTTSRQPNNMMKKIHGGEEDCBAA?>>=<;:987655432100.-~}|{zzxxwvutsrqppnnmkkjihgfedccba`__]\[[ZYXWVUTSSQQPONNMKJIIGFFEDCBB@@?>=<;:987765432200.-,~}|{{yxwwvutsrqqonnmlkjihggeddbbaa_^^\\[ZYXWWVTTSQQPONMLKJJHHFFEDCCBA@>>=<;:98866543211/.--,~}}{zyxwwvttsrrqoonllkjihgffeccba``_^][[YYYXVVUTSRQOONMLKJJIHGFEDCBB@@?>=<;;988765443100/--,+~}|{zyxwwvuttrrqoonmlkjiihgfedcbba_^]]\[ZYXWWVUSSRQPONNLKKJHHGFEDDCBA??>=<;:998665432100/.-,+*~}|{{yywwvutsrqpponmlkjihhfeedcbba`_^][[ZYXWVUTSSRQPONMMKJIIHGFEDDBBA@?>=<<;:88765533200/--,+**~}|{zyyxwvutsrqpoonmmkjiihgfedcbb`__^]\[ZYXXVVTTSRQPONNMKKJIHGFEDCCBA@?>=<<:988765432210..-,,+*(~}}|{yyxwvutsrrqponmlkkihhfeedccaa__^]\[ZYXXVVUSSRQPONMLLKJIHGGFEDBBA@?>>=;;:98765533100/..,,**)(~~||{zyxwwvttsrqpoommkjiihffeddbaa`_]]\[ZYXXWUUTSRQQOONMLJJIHHFFEDCBA@@?=<;;:98765543200/.--++*)('~~}|{zyxwvvtsrqpponmlkkiihgffdcbba`_^]\[[YXWVUUTSSQQPOMMLKJIHHFFEDCBB@@>==<::98765543210/.--,*))(''~~||{zyxwvuutsrpponmlljjihgfeedcaa__^]\[[YXXWVTTSSQQPONMLKJIHHFFEDCBA@@>=<<;:99765542200/..,++*)('&%~~}|{zyywwuttrrqponmmkjjihggeddcba`_^]][[YYXWVUTSSRPOOMMLKKJIGFFEDCBAA?>==<;:99766543210/.-,,+*)('&%$~}|{zyyxwvutsrqponnmkjjihgfeddcba``^^][[ZYXWVUTSRQQPOMMLKJIIGFFEDCBA@??=<<;:98765543210/.--++*)(''%%$}||{zyxwwvutsrqppnmllkjihhffdccba`_^^\\ZZYXWWUTSSQQPONNMKJJIHFFEDCBAA@?>=<;:988764432110.-,,+*)(''&%$#~~}|{{zyxwvutsrqppomlljjihgfeedcbaa__]\\[ZYXWVUTSRQQPONMLKJJIHGFEEDBBA@?>=<<:997765433110..-++*)(''&$##"~}||zyxxwvutssqqoommkkjihhffedcbaa_^]\\ZYYXWWUTTSRQPONMMKKJHGGFEDCBB@@?>=<;::9876543210/.--,+*))'&&%$#"!~}}|zzyxvvutsrqpoonmllkjigfeedbbaa_^^]\[ZYXWWVTTSRQPONMMKKJIHGGEDCCAA??>==;:998765432100/.-,+*))''%%##"! ~}|{{yxxwvutssrpponmlkjihggfedcbaa`^^\\[ZYXXVUTTSRQPONNMLKJIHGFEDCBBA@?>=<;;98876543221//.-,+**((&&%$#"" ~}|{{zyxwvutssrppommlkjihhfeedcbba__^\\[ZYYWVVUSSRQQONNMKKIIHGFFDCCAA@?>><;;998765432100..-,+*))(&&%$#"!! ~}|{{yyxwvutssrpponmlkjiiggfedcbba__^]\[ZZXWVUUTSRQPONNLLKJJHGFEDCCBA@@>=<;;:98765432200/.--+*)(('&%$#"! ~}|{{zxxwvutsrrpponmlkjiihffedccaa__^]\[ZYYWWVUTSRQPONMMLKJIHGGEEDCBAA??>=;;:98765433110/.-,,+*)('&%$#"! ~~||{yyxwvutssrqponmmkjiihgfeddca`__^]\[ZZXWWVTTSRQQPNNMLKJJHHGFECCBA@??>=<;:98775543210/.-,++)(('&&%$#"! }}|{zyxwwuttrrqponnlkjjihgfeddbb``_^]\[ZZYXVVUTSRQQONNMLKJIIGGFEDCBAA@>=<<;998776443200//--,+*)(''%$#"! ~}|{zyxwvvutsqqpoommlkihhggfeccba`_^]\\ZZYXWVUUSRRQPONMLKKIHHFFEDCBB@??==<;:99866533210/..-,+*)('&&$$#!!~}}|{zzyxvuttsrqponmmlkiihggeedcba`_^^\[ZZYXWVUTSSQPPONMLKJJIGFFEDCBB@?>>=<;:99775543211/..-++))('&%$##"! ~~}|{{yxwvuttsrqponmmljjihgfeddcba`_^^][[ZYXWWUTSSQQPONMLKJJHGGFEDCCAA@?==<;:988765432100.--,+*))(&%%$#"! ~~}|{zyxxwuttsrqponnmlkjiihffddcba`_^]]\ZZYXWWUTTRRQPONMMLKJIHFFEDCBAA@?><<;:99866543311//-,,+*))''%$$#"!!}}|{{yyxwvutsrqponmllkjihggeddcba`_^^]\[ZYXXWUUTRQPPONMMKKJIHGFEEDBAA@?>=<;;:9876544211//.-,+*)('&&%#""! ~}|{zzxxwvuttsqqponmlkjihgffecbba`_^^]\[ZYXWVVTSSRQPONMMKKJIHGFEDDBA@@?>==;;98776443210/..,,+**)''&$##"! ~}|{zyxwwvutsrqpoonmlkjihhffddcba``^^]\[ZYXXWVTTSQQPPNMMKJJIHGFEDDBAA@?>=<<:99876544311//.,,+*)(('%$$#"! ~}|{{yyxwvutssqqpnnmlkjihhgeedcbba`_^]\[ZYXXVVTSSQQPOONMKKJIHGFEDDBAA@?>>=<;:98765433200/.-,+**)''&%$#""! ~}|{{zxxwvutsrrqponmmkjjiggfedcba``_^]\[ZYYWVUUTSRQPPOMLLKJIIGFEEDBBA@?>=<;;998776542210/..,,+))''%%%#"! ~~|{{zyxwvuussrpponmlljiihgfeddbba`_^]\[ZYYXVVUTSRQPPOMMLKJJHGGEEDCBA@?>=<<;:98866533200/.--++))('&%$##! gdalautotest-3.2.2/gdrivers/data/adrg/SMALL_ADRG_ZNA9/README.TXT0000664000175000017500000000104714020414072022147 0ustar evenevenCopied from data/SMALL_ADRG and modified with the following procedure: - ../../gdal/frmts/iso8211/8211dump -xml data/SMALL_ADRG_ZNA9/ABCDEF01.GEN > /tmp/tmp.xml - edit /tmp/tmp.xml to modify the ZNA, ARV, BRV, LSO, PSO to match the ones of the dump of ASRP/TEST01/TEST0101.GEN from https://trac.osgeo.org/gdal/attachment/ticket/6560/ASRP_Polar_Test_Data.zip Caution in ASRP, LSO and PSO are stored in arc-seconds, whereas in ADRG they are in DD[D]MMSS.SS - ../../gdal/frmts/iso8211/8211createfromxml /tmp/tmp.xml data/SMALL_ADRG_ZNA9/ABCDEF01.GEN gdalautotest-3.2.2/gdrivers/data/sgi/0000775000175000017500000000000014020414072016206 5ustar evenevengdalautotest-3.2.2/gdrivers/data/sgi/byte.sgi0000664000175000017500000000212514020414072017655 0ustar evenevenA+~hR<&k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksss{{{kk{s{ksc{skŭc{sc{{s{s{{kssksc{cck{ss{s{{csc{sskccs{kksks{{k{{c{kcs{{k{k{k{{ssZkkc{sc{{k{ckksskckk{ccsccs{c{kZkskZc{s{{sc{kscscckssZ{ssZcsZcckcck{cs{Jsc{c΄k{{k{k{sksckgdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/0000775000175000017500000000000014020414072021161 5ustar evenevengdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107LDEF.DDF0000664000175000017500000000043614020414072022526 0ustar eveneven001962L 1 0600049 22040000210000012921LDEF97500000;&1107LDEF.DDF0100;&DDF RECORD IDENTIFER1600;&Layer DefinitionMODN!RCID!CMNM!LLBL!CODE!NROW!NCOL!SORI!SOCI!RWOO!CLOO!INTR(A,I,3A,6I,A)00090 D 1 00039 21040001080LDEF4380000001LDEF1CEL0ELEVATIONV0253391100CEgdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DQAA.DDF0000664000175000017500000000050214020414072022514 0ustar eveneven001472L 1 0600049 22040000210000012921DQAA48500000;&1107DQAA.DDF0100;&DDF RECORD IDENTIFER1600;&Attribute AccuracyMODN!RCID!COMT(A,I,A)00175 D 1 00041 310400010080DQAA12680000001DQAA1No Attribute Accuracy to report. See Positional Accuracy module, because the cell values are elevation measurements.gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DQCG.DDF0000664000175000017500000000522714020414072022535 0ustar eveneven001412L 1 0600049 22040000210000012921DQCG42500000;&1107DQCG.DDF0100;&DDF RECORD IDENTIFER1600;&CompletenessMODN!RCID!COMT(A,I,A)00081 D 1 00039 21040001080DQCG3480000001DQCG1VOID AREAS: No void areas.00793 D 1 00041 310400010080DQCG74480000002DQCG2The 7.5-minute series DEMS are based on a UTM grid. Hence, the scans do not always have the same number of elevation posts due to the variable angle between true north and grid north of the UTM coordinate system. Any elevation post that falls outside of the 7.5-minute quadrangle edge is dropped, i.e. there is no overedge. The 7.5-minute DEM will be encoded as a non-ragged grid by filling with a background post value to the edges of the minimum bounding rectangle. The fill value is distinguishable from all other elevation post values, and it will be same value for all USGS DEM series encoded in SDTS. The Void post value(-32767) will not be reused as the fill value, so the original extent of the DEM data can easily be detected.00471 D 1 00041 310400010080DQCG42280000003DQCG3Void areas occur in the DEM as a result of interruptions to the contours of the source graphic or DLG (eg. photoimages overprinted onto a topographic map). Each DEM elevation post located within a void area is assigned a false negative value of -32,767. The percentage of void elevation values in the DEM, if present, was calculated from the total number of grid posts in the DEM assigned the false negative value.01225 D 1 00043 4104000100080DQCG117480000004DQCG4HYDROGRAPHY INCLUDED: For DEM Level 1 and 2, water bodies contained in DEM data are edited when they conform to the following criteria: 1) Type is a pond, lake, reservoir, or double-line drainage; and, 2) Size of a pond, lake or reservoir exceeds approximately 1/2 inch at map scale (1000 feet at 1:24,000 scale, 4167 feet at 1:100,000 scale) along the major axis; or, 3) Size of a double-line drain exceeds 1/4 inch (500 feet at 1:24,000 scale, 2087 feet at 1:100,000 scale) in width. For level 3 DEM's, the grid is constrained by all major hydrographic features contained within a DLG hydrography category, including drainage, lakes, swamps, and shorelines. Elevations of hydrographic features are determined through interpolation of contours using a registered DLG hypsography file. DEM surfaces constrained to drains are treated as a special case of hypsographic faulting where the DEM surface is simply creased along the track line of the drain. Additionally, all grid cells are tilted consistent with the direction of stream flow, along the track line of the drain. There must not be any unsupported breaks or discontinuities in the rate of slope of the drain.gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DDDF.DDF0000664000175000017500000000053114020414072022511 0ustar eveneven001762L 1 0600049 22040000210000012921DDDF77500000;&1107DDDF.DDF0100;&DDF RECORD IDENTIFER1600;&Data Dictionary/DefinitionMODN!RCID!EORA!EALB!DFIN!AUTH!ADSC(A,I,5A)00169 D 1 00041 310400010080DDDF12080000001DDDF1ATTELEVATIONThe vertical distance from a given datumUSGS/NMDU.S. Geological Survey/National Mapping Divisiongdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DDSH.DDF0000664000175000017500000000044114020414072022532 0ustar eveneven001832L 1 0600049 22040000210000012921DDSH84500000;&1107DDSH.DDF0100;&DDF RECORD IDENTIFER1600;&Data Dictionary/SchemaMODN!RCID!NAME!TYPE!ATLB!AUTH!FMT!UNIT!PREC(A,I,6A,R)00106 D 1 00039 21040001080DDSH5980000001DDSH1CEL0CELLELEVATIONUSGS/NMDBI16METERS1.00000000gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107RSDF.DDF0000664000175000017500000000102014020414072022540 0ustar eveneven003512L 1 0600085 330400000210000001029021RSDF112050ISID042162SADR031204LYID0312350000;&1107RSDF.DDF0100;&DDF RECORD IDENTIFER1600;&Raster DefinitionMODN!RCID!OBRP!CSCD!DEFI!RWXT!CLXT!SCOR!TIDX!ALTN!FSCN!ASPR!NLAY(A,I,3A,2I,2A,I,A,R,I)1600;&Internal Spatial IDMODN!RCID(A,I)1600;&Spatial AddressX!Y(2R)1600;&Layer IDMODN!RCID(A,I)00177 D 1 00070 2304000108000RSDF52008ISID07060SADR33067LYID071000000001RSDF1G2GIDEF472339TLNOTESS1R1.000000001IREF1666030.000000005040720.00000000LDEF1gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107CEL0.DDF0000664000175000017500000004277314020414072022511 0ustar eveneven001882L 1 0600057 22040000210000012921CELL4450CVLS37940000;&1107CEL0.DDF0100;&DDF RECORD IDENTIFER1600;&CellMODN!RCID!ROWI!COLI(A(4),3I(5))2600;&Cell Values*ELEVATION(B(16))00759 R 1 00052 3204000100800CELL02008CVLS679280000001CEL0000010000100001Ȁ0000002CEL0000020000200001Ȁ0000003CEL0000030000300001Ȁ0000004CEL0000040000400001  Ȁ0000005CEL0000050000500001                   Ȁ0000006CEL0000060000600001                         Ȁ0000007CEL0000070000700001,,/0/-+(%""""""""!""!! !!                     Ȁ0000008CEL0000080000800001)('''&%$##""""""""""##$%&'''(*+,,,+++,/10/,)&$""""""!  "!"                 ɀ0000009CEL00000900009000017999866689;?CC?><;;;=>?><9:;;:610.,+*)(''''&%$$#"""""""""""#$%&'')*,,,,*)*+-011-)&$#$%%#! "               ɀ0000010CEL00001000010000017766668:;<;9668;;;@DA?><;;<>@@?=;<<=<830/-+*)'''''&&%$#"""""""""""#$&'()+,,,+)()*+.01.+'%#$'''$!                ɀ0000011CEL00001100011000017777767:<>><98:<<=>B@@>=;;;<>@@>;;=??>:51/-,+)('''(''%$#"""""""""""$%')+,,,,+)''''*-/-,(%#$&'''#             ɀ0000012CEL00001200012000019998878:<@@@<;<>@@@@@@?><;;;;=>=;;;=@@?:61/.+*('())))'%$#""""""""""#%&(+,,,,,*''&&&),,,*&#"#'''&"            Ȁ0000013CEL0000130001300001<;;::99:<>@BA>>@AAAAAAA?>=;;;;<<;;;;>@@?951/,*)()**++(&%$#""""""""""$%'*,,,,,*'%$$%%&*,,(%""#&''#!             ƀ0000014CEL0000140001400001BB@>;;;<>@ADEB@ABBCCCCBB@?=;;;;;;;;;;>@@<851-+*)*++,,*'&%#"""""""""""$&),,++,)'%#"##"&),,($""#%'%#!!            0000015CEL0000150001500001EEDB?<<>@@ADEEDBDDDDEEEDCB@><;;9:;;;9:<@>762-,+*+,,++,)'&$#""""""""""#%')))*,*'%#"!! !#(+(%"""$''%#!              0000016CEL0000160001600001EEEEB?>@BBCEEGHFEEEFGHHGFECA?<:879:9768;<721,,++,+*)*+,*'%$#""""""""""$'&&'(,,'%#! !%'%""""$&&$#!               À0000017CEL0000170001700001DIHDBA@BEEEEHJIGEFHIJJJGEEDA><8666665567311/.-,+*)()*+,)&%#"""""""""""##"#$'(%$#!!""""!"%'&$#              ƀ0000018CEL0000180001800001CHJIFECDEFGFIJJJHIJIHHFECBA@>;9666664223112330-+)(''()*)'&$"""""""""""""""""""""  "! #''%#!!"              ǀ0000019CEL0000190001900001=EJKJHFEEHJJJJJJJJGEEC@@@@=;;;96666654226::874/+*('''''''&$#""""""""""""""""!  "&&%#! !""                    Ȁ0000020CEL0000200002000001<@HNOMIHEFIJJJJJIGEEEBB@AA?=;;::866666567:;;950,*)(''''''&$#""""""""""""""""! !" "'&#""! !"'$!                       Ȁ0000021CEL0000210002100001;<CHOOKKIGIJJJJIGEEEEDFEFFB@@>?=:8666666669;961,*)(''''''&$#"""""""""$#"#$$$" "%&# !#""""!  !!"#&'%"                    Ȁ0000022CEL0000220002200001;;>EJOPNMJJJJJJIEFHHGGJIJFEDA@@?=:8666665557860-+)('''''&%$#"""""""#$&&&'')(&"!! !#''%!""""!!"!"$&''&"                    Ȁ0000023CEL0000230002300001@>>@FMTROKKJJJJJGHJJIIJJJHGECCBA@<9666654434541.+(''''''&%$#"""""""#%''()*,,*'&%$"#'''"      """!!$%'''%#                   ǀ0000024CEL0000240002400001@AA@AGLOONNLJJJJIJJJJJJJJJJGEEDB@=:766543222221-*(''''''&%$#""""""""$&')*,,,,+*('$$'''$$%%%%!%'# "#&'''&$!                 ǀ0000025CEL0000250002500001<AEEADFKOQOMJJJJJJJJJJJJJJJHFEDB?=;8665322110/.+)'''''''&%#"##"""""""%')*,,,,,+*)'''))')+*)'$$'$ !&''''&#             ŀgdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107IDEN.DDF0000664000175000017500000000115114020414072022526 0ustar eveneven002752L 1 0600061 2304000021000000129021IDEN96050CONF681460000;&1107IDEN.DDF0100;&DDF RECORD IDENTIFER1600;&IdentificationMODN!RCID!STID!STVS!DOCU!PRID!PDOC!PRVS!TITL!DAID!DAST!MPDT!DCDT(A,I,11A)1600;&ConformanceFFYN!VGYN!GTYN!RCYN!EXSP!FTLV!CDLV!NGDM(4A,3I,A)00342 D 1 00055 33040001008000IDEN263008CONF0162710000001IDEN1SPATIAL DATA TRANSFER STANDARD1998 JUNE 9ANSI NCITS 320-1998SRPE: SDTS RASTER PROFILE and EXTENSIONSFederal Geographic Data Committee FGDC-STD-002.51998ALANSON, MI-24000LAT:: 45 22 30.0000 N LONG:: -84 45 0.0000 W SCALE:: 24000DEM19982001808NNNY140Ngdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DQHL.DDF0000664000175000017500000001111414020414072022537 0ustar eveneven001362L 1 0600049 22040000210000012921DQHL37500000;&1107DQHL.DDF0100;&DDF RECORD IDENTIFER1600;&LineageMODN!RCID!COMT(A,I,A)01754 D 1 00043 4104000100080DQHL170380000001DQHL1CONVERSION TO SDTS: This DEM was converted to SDTS Raster Profile as part ofa mass conversion of US Geological Survey Digital Elevation model archive to SDTS. The data organization was changed from a southwest origin with south to north scans to a northwest origin with west to east scans. The x,y grid positions were not altered -- i.e., the data was not resampled. The UTM gridded DEMs are ragged in their native form. A fill value was used too make the DEM grid rectangular in this transfer. GENERAL NOTES: A number of factors affect gridding processes and the accuracy of the final DEM product: 1) A dependency exists between the scale of the source materials and the level of detail or grid refinement that is possible from a given source. 2) During the process of changing scale, from large to small, some source data may be generalized or dropped out and, therefore, some features would not be available for formation of, or incorporation into, a grid at that scale. 3) The process of forming a grid with regular spacing requires the transfer of precise point or vector data to generalized grid square corners using a process similar to taking a simple weighted average. This process may alter the apparent position upon display of point or vector source data, reducing the ability to recover positions of specific features whose dimensions are less than the internal grid cell spacing. For all DEM's, the grid spacing and spatial resolution results in data intervals that span terrain discontinuities, such as benches, tops, and drainage. Some features can be appropriately captured at a given grid spacing while other, smaller features are subdued or filtered out altogether.00087 D 1 00039 21040001080DQHL4080000002DQHL2DEM CELL NAME: ALANSON, MI-2400000117 D 1 00039 21040001080DQHL7080000003DQHL3PROCESS CODE 5: DLG/hypsography LINETRACE, LT4X complex linear00070 D 1 00039 21040001080DQHL2380000004DQHL4DEM PRODUCER: 00066 D 1 00039 21040001080DQHL1980000005DQHL5DEM LEVEL-200436 D 1 00041 310400010080DQHL38780000006DQHL6DEM LEVEL 2 means: DEM created from digital line graph (DLG) contours or equivalent, or from any USGS map series up to 1:100,00 scale using stable base contour separate or equivalent. DEM data derived from hyposgraphic and hydrographic data digitizing, either photogrammetrically or from existing maps, are entered into the Level 2 category after review on a DEM editing system.00105 D 1 00039 21040001080DQHL5880000007DQHL7SOURCE DATE OF PUBLISHED MAP OR PHOTOGRAPHY: 198300094 D 1 00039 21040001080DQHL4780000008DQHL8DATA INSPECTION OR REVISION DATE: 199800145 D 1 00039 21040001080DQHL9880000009DQHL9INSPECTION FLAG: Iindicates all process of part three quality control have been performed.00152 D 1 00041 310400010080DQHL10380000010DQHL10DATA VALIDATION FLAG: Level 2 and 3 DEMs reviewed and edited. RSME computed from test points.00085 D 1 00039 21040001080DQHL3880000011DQHL11DATA EDITION: 1: USGS default00111 D 1 00039 21040001080DQHL6480000012DQHL12GRID RESOLUTION: 30.000000 METERS X, 30.000000 METERS Y01326 D 1 00043 4104000100080DQHL127580000013DQHL13VISUAL VERIFICATION: Because of practical limitations inherent in all collection systems, there will always be some artifacts such as benches, striations, patches, or some other anomaly that imparts some signature of the collection system in the data set. Some of these artifacts, although falling within normal DEM vertical error tolerances, can coalesce with valid surface features. All DEM's are viewed and edited so corrective actions can be taken to minimize these artifacts. For example, 1) Isolated tops are depicted with their approximate size and shape; 2) Flat trending surfaces are depicted as generally flat trending without confusing patterns or striations; and, 3) Water bodies are flat, lower than the surrounding terrain, and have shorelines clearly delineated. Additional testing is performed using a DEM Editing System (DES) to aid in the identification of blunders such as irregularly gridded data, mistagging of tops and depressions, and spikes. These blunders are generally identified by displaying the DEM with the aid of DES options, which include color banding of elevation gradients, stereoscopic viewing using anaglyphic filters, and shaded-relief enhancement. An elevation matrix is analyzed in suspect areas and corrected as required.gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DDOM.DDF0000664000175000017500000000127414020414072022540 0ustar eveneven001912L 1 0600049 22040000210000012921DDOM92500000;&1107DDOM.DDF0100;&DDF RECORD IDENTIFER1600;&Data Dictionary/DomainMODN!RCID!ATLB!AUTH!ATYP!ADVF!ADMU!RAVA!DVAL!DVDF(A,I,6A,I,A)00114 D 1 00039 21040001080DDOM6780000001DDOM1ELEVATIONUSGS/NMDINTEGERIVALUE-32767Void area in DEM00141 D 1 00039 21040001080DDOM9480000002DDOM2ELEVATIONUSGS/NMDINTEGERIVALUE-32766Fill Value used to make the DEM a rectangle00127 D 1 00039 21040001080DDOM8080000003DDOM3ELEVATIONUSGS/NMDINTEGERIMETERSMIN182Minimum elevation of the DEM00127 D 1 00039 21040001080DDOM8080000004DDOM4ELEVATIONUSGS/NMDINTEGERIMETERSMAX345Maximum elevation of the DEMgdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107CATS.DDF0000664000175000017500000000523614020414072022551 0ustar eveneven001762L 1 0600049 22040000210000012921CATS77500000;&1107CATS.DDF0100;&DDF RECORD IDENTIFER1600;&Catalog/Spatial DomainMODN!RCID!NAME!TYPE!MAP!THEM!AGOB!AGTP(A,I,6A)00133 D 1 00039 21040001080CATS8680000001CATS1IDENIdentificationALANSON, MI ELEVATIONDEM1G200145 D 1 00039 21040001080CATS9880000002CATS2IREFInternal Spatial ReferenceALANSON, MI ELEVATIONDEM1G200145 D 1 00039 21040001080CATS9880000003CATS3XREFExternal Spatial ReferenceALANSON, MI ELEVATIONDEM1G200133 D 1 00039 21040001080CATS8680000004CATS4SPDMSpatial DomainALANSON, MI ELEVATIONDEM1G200139 D 1 00039 21040001080CATS9280000005CATS5DQHLData Quality/LineageALANSON, MI ELEVATIONDEM1G200153 D 1 00041 310400010080CATS10480000006CATS6DQPAData Quality/Positional AccuracyALANSON, MI ELEVATIONDEM1G200152 D 1 00041 310400010080CATS10380000007CATS7DQAAData Quality/Attribute AccuracyALANSON, MI ELEVATIONDEM1G200153 D 1 00041 310400010080CATS10480000008CATS8DQLCData Quality/Logical ConsistancyALANSON, MI ELEVATIONDEM1G200144 D 1 00039 21040001080CATS9780000009CATS9DQCGData Quality/CompletenessALANSON, MI ELEVATIONDEM1G200146 D 1 00039 21040001080CATS9980000010CATS10DDDFData Dictionary/DefinitionALANSON, MI ELEVATIONDEM1G200142 D 1 00039 21040001080CATS9580000011CATS11DDOMData Dictionary/DomainALANSON, MI ELEVATIONDEM1G200142 D 1 00039 21040001080CATS9580000012CATS12DDSHData Dictionary/SchemaALANSON, MI ELEVATIONDEM1G200137 D 1 00039 21040001080CATS9080000013CATS13RSDFRaster DefinitionALANSON, MI ELEVATIONDEM1G200136 D 1 00039 21040001080CATS8980000014CATS14LDEFLayer DefinitionALANSON, MI ELEVATIONDEM1G200124 D 1 00039 21040001080CATS7780000015CATS15CEL0CellALANSON, MI ELEVATIONDEM1G200142 D 1 00039 21040001080CATS9580000016CATS16CATSCatalog/Spatial DomainALANSON, MI ELEVATIONDEM1G200139 D 1 00039 21040001080CATS9280000017CATS17STATTransfer StatisticsALANSON, MI ELEVATIONDEM1G200137 D 1 00039 21040001080CATS9080000018CATS18CATDCatalog/DirectoryALANSON, MI ELEVATIONDEM1G2gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107IREF.DDF0000664000175000017500000000054614020414072022543 0ustar eveneven002072L 1 0600052 3204000002100000102921IREF105500000;&1107IREF.DDF0100;&DDF RECORD IDENTIFER1600;&Internal Spacial ReferenceMODN!RCID!SATP!XLBL!YLBL!HFMT!SFAX!SFAY!XORG!YORG!XHRS!YHRS(A,I,4A,6R)00151 D 1 00041 310400010080IREF10280000001IREF12-TUPLEEastingNorthingR1.000000001.000000000.000000000.0000000030.0000000030.00000000gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107SPDM.DDF0000664000175000017500000000063414020414072022557 0ustar eveneven001992L 1 0600061 2304000021000000129021SPDM50050DMSA381000000;&1107SPDM.DDF0100;&DDF RECORD IDENTIFER1600;&Spatial DomainMODN!RCID!DTYP!DSTP(A,I,2A)1600;&Domain Spatial AddressX!Y(2R)00213 D 1 00052 3204000100800SPDM02108DMSA132290000001SPDM1RINGEXTERNAL666390.919530005026588.57789500666023.795294005040475.32910700675789.821559005040741.40018700676178.562581005026854.66559100gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DQLC.DDF0000664000175000017500000000261014020414072022533 0ustar eveneven001482L 1 0600049 22040000210000012921DQLC49500000;&1107DQLC.DDF0100;&DDF RECORD IDENTIFER1600;&Logical ConsistencyMODN!RCID!COMT(A,I,A)00650 D 1 00041 310400010080DQLC60180000001DQLC1EDGE MATCH STATUS: West(1), North(1), East(4), South(4). Edge matching is a process of matching elevation values along common quadrangle edges. The objective of edge matching is to improve the alignment of ridges and drains and overall topographic shaping and representation. Code of 0 = not edge matched; 1 = edge match checked and joined; 2 = not edge matched because adjoining DEM is on a different horizontal or vertical datum; 3 = not edge matched because the adjoining DEM is not part of the current project; 4 = not edge matched because the adjoining DEM has a different vertical unit.00618 D 1 00041 310400010080DQLC56980000002DQLC2NULL SCHEME: The method for indicating no value for a cell in the Cell module records contained in this transfer is described here. In the Data Dictionary Domain module there are specific values that are reserved to mean VOID and FILL for ELEVATION. VOID means there is no elevation measurement available for a cell that falls within the *geographic boundaries* of the DEM. (In the geographic coordinate system the bounds of the DEM data are rectangular.) A fill also means there is no data, but is used to make the DEM rectangular in the UTM coordinate system.gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107DQPA.DDF0000664000175000017500000000633014020414072022540 0ustar eveneven001482L 1 0600049 22040000210000012921DQPA49500000;&1107DQPA.DDF0100;&DDF RECORD IDENTIFER1600;&Positional AccuracyMODN!RCID!COMT(A,I,A)00295 D 1 00041 310400010080DQPA24680000001DQPA1DEM LEVEL 2 means: Data sets have been processed or smoothed for consistency and edited to remove identifiable systematic errors. An RMSE of half of the contour interval is the maximum permitted, with no errors greater than one contour.00197 D 1 00041 310400010080DQPA14880000002DQPA2ACCURACY: RMSE of the DEM data relative to the file's datum (x,y,z) is (0, 0, 1); accuracy has been calculated based on a sample size of 30.00076 D 1 00039 21040001080DQPA2980000003DQPA3CONTOUR INTERVAL: 5.00087 D 1 00039 21040001080DQPA4080000004DQPA4CONTOUR INTERVAL UNITS: METERS.00087 D 1 00039 21040001080DQPA4080000005DQPA5SUSPECT AREAS: No suspect areas.00297 D 1 00041 310400010080DQPA24880000006DQPA6VERTICAL DATUM SHIFT: -0.050000. Adding this value to the elevation values will convert it to North American Vertical Datum 1988. Value is computed by averaging the shift values for the four quadrangle corners obtained from program VERTCON.01219 D 1 00043 4104000100080DQPA116880000007DQPA7SUSPECT AREAS: Suspect areas in the DEM result from corresponding areas on the graphic source that are shown as disturbed surfaces. They are symbolized by contours that have been overprinted with photorevised or other surface patterns. Examples of disturbed surfaces are: lava flows, land slides, open pit mining, construction cut and fill, and land fill operations. An estimated elevation is supplied for suspect areas based on the presumed elevation at the time the DEM grid is generated; however, the true elevation is subject to change without notice. When an elevation cannot be estimated for a suspect area, the area is downgraded to a void area and assigned a false negative value -32,767. Grid posts falling in suspect areas are added to the DEM grid as though they were valid elevations; they are distinguishable from normal DEM grid posts only by an independent inspection of the graphic source. For this reason, no percentage value for the total number of cells in the DEM that are assigned an estimated value. Suspect areas relate only to graphic sources. Furthermore, no commensurate code exists for suspects areas in the DLG hypsography category.00296 D 1 00041 310400010080DQPA24780000008DQPA8WATER BODIES: Water body areas are naturally occurring areas of constant elevation. Oceans or estuaries at mean sea level are assigned an elevation value of zero. All other water bodies are assigned their known or an estimated elevation.00586 D 1 00041 310400010080DQPA53780000009DQPA9HORIZONTAL ACCURACY: The horizontal positions of grid posts in USGS DEM's are located at precise mathematically defined positions in UTM meters or arc seconds. These grid posts are fixed in position and can be considered constants for the purpose of determining accuracy. The only measurable or perceivable errors in the DEM exist as vertical errors that may be partially attributable to horizontal error inherent in the source data or to errors in converting horizontal and vertical components of the source to gridded format.gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/README0000664000175000017500000000574614020414072022055 0ustar evenevenThis dataset has been truncated to 25 scanlines for GDAL testing purpose. Original README: **************************************************************************** NOTICE: THESE FILES ARE FOR SOFTWARE TESTING ONLY NOT FOR DISTRIBUTION **************************************************************************** 1:24,000-Scale Raster Profile Digital Elevation Model Readme File Version: 08/2001 (README) This directory contains a Spatial Data Transfer Standard (SDTS)-compliant raster profile transfer, produced by the National Mapping Program of the U.S. Geological Survey (USGS). This transfer corrects potential horizontal errors in SDTS DEMs created before January 1, 2001. This transfer also corrects a variant in the profile identifier field. If you have questions or comments, please send e-mail to sdts@usgs.gov or contact the USGS at: U.S. Geological Survey SDTS Task Force 1400 Independence Road Rolla, MO 65401 PURPOSE OF TRANSFER: The mission of the USGS National Mapping Program is to meet the Nation's need for basic geospatial data, ensuring access to and advancing the application of these data and other related earth science information for users worldwide. These data are provided in SDTS format as the result of a Federal mandate. The digital elevation model (DEM) is the USGS National Mapping Program's response to the Nation's need for accurate and consistent geospatial digital elevation data in raster format. STANDARD AUTHORITY: American National Standards Institute (ANSI): Parts 1-3: ANSI NCITS 320-1998 The Spatial Data Transfer Standard Federal Geographic Data Committee: FGDC-STD-002.5-1999, February 1999 Part 5: SDTS Raster Profile (RPE) with Basic Image Interchange Format (BIIF). ISO 8211 CONFORMANCE: All files with extension *.DDF are in the ISO 8211 file transfer format. All SDTS spatial addresses are expressed in two 32-bit binary subfields defined by the ISO 8211. Files are Level 2 of ISO 8211. CATALOG DIRECTORY MODULE xxxxCATD.DDF: Each transfer includes this catalog directory module that contains a listing of every SDTS ISO 8211 file included in the transfer (xxxx indicates a four-character transfer base that is common to all files in a transfer). IDENTIFICATION MODULE xxxxIDEN.DDF: This module contains information that describes the overall characteristics of the data in a transfer. REFERENCES: "The Spatial Data Transfer Standard Mapping of the USGS Digital Elevation Model" describes SDTS transfers of DEM data, including detailed information on each module. The file can be downloaded from the SDTS FTP site: ftp://sdts.er.usgs.gov/pub/sdts/datasets/raster/dem/ Additional information can be found on the SDTS Web site: http://mcmcweb.er.usgs.gov/sdts gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107STAT.DDF0000664000175000017500000000326714020414072022574 0ustar eveneven001672L 1 0600049 22040000210000012921STAT68500000;&1107STAT.DDF0100;&DDF RECORD IDENTIFER1600;&Transfer StatisticsMODN!RCID!MNTF!MNRF!NREC!NSAD(A,I,2A,2I)00078 D 1 00039 21040001080STAT3180000001STAT1IdentificationIDEN1000090 D 1 00039 21040001080STAT4380000002STAT2Internal Spatial ReferenceIREF1000090 D 1 00039 21040001080STAT4380000003STAT3External Spatial ReferenceXREF1000086 D 1 00039 21040001080STAT3980000004STAT4Data Dictionary/SchemaDDSH1000086 D 1 00039 21040001080STAT3980000005STAT5Data Dictionary/DomainDDOM4000085 D 1 00039 21040001080STAT3880000006STAT6Data Quality/LineageDQHL13000096 D 1 00039 21040001080STAT4980000007STAT7Data Quality/Positional AccuracyDQPA9000095 D 1 00039 21040001080STAT4880000008STAT8Data Quality/Attribute AccuracyDQAA1000096 D 1 00039 21040001080STAT4980000009STAT9Data Quality/Logical ConsistencyDQLC2000090 D 1 00039 21040001080STAT4380000010STAT10Data Quality/CompletenessDQCG4000082 D 1 00039 21040001080STAT3580000011STAT11Raster DefinitionRSDF1000081 D 1 00039 21040001080STAT3480000012STAT12Layer DefinitionLDEF1000083 D 1 00039 21040001080STAT3680000013STAT13Catalog/DirectoryCATD18000088 D 1 00039 21040001080STAT4180000014STAT14Catalog/Spatial DomainCATS18000091 D 1 00039 21040001080STAT4480000015STAT15Data Dictionary/DefinitionDDDF1000079 D 1 00039 21040001080STAT3280000016STAT16Spatial DomainSPDM1000071 D 1 00039 21040001080STAT2480000017STAT17CellCEL0472000085 D 1 00039 21040001080STAT3880000018STAT18Transfer StatisticsSTAT180gdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107XREF.DDF0000664000175000017500000000100314020414072022547 0ustar eveneven002332L 1 0600061 2304000021000000129021XREF72050VATT501220000;&1107XREF.DDF0100;&DDF RECORD IDENTIFER1600;&External Spatial ReferenceMODN!RCID!COMT!RSNM!HDAT!ZONE(A,I,4A)1600;&Vertical AttributesVDAT!VEM!ATLB!AUTH(4A)00282 D 1 00055 33040001008000XREF190008VATT0291980000001XREF1National Geodetic Vertical Datum 1929 Vertical Datum Shift = -0.05; always add to convert from National Geodetic Vertical Datum 1929 to North American Vertical Datum 1988.UTMNAS16NGVDCELLELEVATIONUSGS/NMDgdalautotest-3.2.2/gdrivers/data/STDS_1107834_truncated/1107CATD.DDF0000664000175000017500000000363314020414072022531 0ustar eveneven001672L 1 0600049 22040000210000012921CATD68500000;&1107CATD.DDF0100;&DDF RECORD IDENTIFER1600;&Catalog/DirectoryMODN!RCID!NAME!TYPE!FILE!EXTR!MVER(A,I,5A)00091 D 1 00039 21040001080CATD4480000001CATD1IDENIdentification1107IDEN.DDFN100103 D 1 00039 21040001080CATD5680000002CATD2IREFInternal Spatial Reference1107IREF.DDFN100103 D 1 00039 21040001080CATD5680000003CATD3XREFExternal Spatial Reference1107XREF.DDFN100099 D 1 00039 21040001080CATD5280000004CATD4DDSHData Dictionary/Schema1107DDSH.DDFN100099 D 1 00039 21040001080CATD5280000005CATD5DDOMData Dictionary/Domain1107DDOM.DDFN100097 D 1 00039 21040001080CATD5080000006CATD6DQHLData Quality/Lineage1107DQHL.DDFN100109 D 1 00039 21040001080CATD6280000007CATD7DQPAData Quality/Positional Accuracy1107DQPA.DDFN100108 D 1 00039 21040001080CATD6180000008CATD8DQAAData Quality/Attribute Accuracy1107DQAA.DDFN100109 D 1 00039 21040001080CATD6280000009CATD9DQLCData Quality/Logical Consistency1107DQLC.DDFN100103 D 1 00039 21040001080CATD5680000010CATD10DQCGData Quality/Completeness1107DQCG.DDFN100095 D 1 00039 21040001080CATD4880000011CATD11RSDFRaster Definition1107RSDF.DDFN100094 D 1 00039 21040001080CATD4780000012CATD12LDEFLayer Definition1107LDEF.DDFN100095 D 1 00039 21040001080CATD4880000013CATD13CATDCatalog/Directory1107CATD.DDFN100100 D 1 00039 21040001080CATD5380000014CATD14CATSCatalog/Spatial Domain1107CATS.DDFN100097 D 1 00039 21040001080CATD5080000015CATD15STATTransfer Statistics1107STAT.DDFN100104 D 1 00039 21040001080CATD5780000016CATD16DDDFData Dictionary/Definition1107DDDF.DDFN100092 D 1 00039 21040001080CATD4580000017CATD17SPDMSpatial Domain1107SPDM.DDFN100082 D 1 00039 21040001080CATD3580000018CATD18CEL0Cell1107CEL0.DDFN1gdalautotest-3.2.2/gdrivers/data/netcdf/0000775000175000017500000000000014020414072016667 5ustar evenevengdalautotest-3.2.2/gdrivers/data/netcdf/trmm.tif0000664000175000017500000002142214020414072020353 0ustar evenevenII*((  (S    Y Latitude latitude degrees_north X Longitude longitude degrees_east standard Climate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi) Climate Data Operators version 1.5.2 (http://code.zmaw.de/projects/cdo) gsfc file created by grads using lats4d available from http://dao.gsfc.nasa.gov/software/grads/lats4d/ CF-1.4 Wed Sep 07 22:33:59 2011: cdo sellonlatbox,-80,-70,-20,-10 tmp4-noc.nc tmp5.nc Wed Sep 7 22:33:53 2011: ncatted -a Conventions,global,d,, tmp4.nc tmp4-noc.nc Wed Aug 24 12:59:04 2011: ncatted -D 10 -a CoreMetadata.0,global,d,, -a ArchiveMetadata.0,global,d,, tmp3.nc tmp4.nc Tue Aug 23 21:04:45 2011: cdo seltimestep,1 tmp2.nc tmp3.nc Tue Aug 23 19:19:18 2011: cdo selvar,pcp tmp1.nc tmp2.nc Tue May 17 19:34:24 2011: cdo sellonlatbox,-85.25,-29.625,15.25,-50 3B43.2011.nc tmp1.nc Tue May 17 19:26:31 2011: cdo mergetime 3B43.110101.6A.nc 3B43.110201.6A.nc 3B43.110301.6A.nc 3B43.110401.6A.nc 3B43.2011.nc geos/das -9999.900391 Unknown1 variable comment grid-1 Earth surface precipitation:Precipitation instantaneous standard time hours since 2011-01-01 00:00:00 0 hours since 2011-01-01 00:00:00 pcp -9999.900390625??T$D:!;əZ;z;53<$4<<_!O=k[=ao=z=N=y>Fj>>Ʈ>Ē>$ >1>*>a>]{>qPx>┑>q>>>Y>>w>>>>>R>&>)::;W!M; ;*<\<,<2fN=LJ}=I=\Ь==ZF>ܓ>伻>`>>k>>#>>>1>=>>V>r>>.?>ȣ>Ț>5>tB>~>NQ>> )8p::ۤ:;/;;^2>q}>>>A>>}>>O>N>>,>ު>A>ey>>>>]>Ӥ>> >>3o::{Q:eY; ;?>>h>Ψ>R>S><>>ɹ?,>>#>3>̏>W> > a>4>#y>`'l>p>mV>> 8:0:W:U ;EP;f;\T;&1J<&<<<ݬ~/>ڛ?>RT>>:>>O>>ʏ>@l>T> i>z[>q]>}>Ł>k}^>L>[Q>h>>8ɩ;j:u7:<:,k;I;/v;ȏ;<^.>>2> D>>,> M>>V{>X>)]>hb>9q>(|>>0d>|>>>'̠> Cc;O<\:c:g:>:#;2;O;;j<,Q.4>A>_h>o>>>>o˘>r}>ow>Nn>`g>>U~>Ӫ> >i>> :x:uȢ:3:/v:K[:5;+e4;gw;=P#g>oy>>qׇ>zͧ>>:>>k>>s>Y>f7_>W>]K>>%>%>tr]>pn>i>v>9ę>>)]>-ԥ>4>؏>qJ>4I>e>Mcq>Bџ>>>[>Ґ:>GV>UP>Q>:]>߷t>V>7>,>_G3>KX>5y>pe>~m>Q>a4>>> V;U[;: :Ļi:%:퀑:Ġ:#;;GG8>>zU>S>bE>c >=>>mX>>>̮>> I>=^>> )8 : 9{&;8!:h:2S:: :$=;=i <({<\]=*=7T=}u=Um='=r=z=>Mt6>fN>G>>l>21>1>8>J@>T?غ? ??I>> 9ɩ;h: ):99T9FoA:}:{0;90;r<|GD={=iX==೮=Yؠ=l=?=a.>]'>by'>9$>>Si>o>>7y@>{>`>V?8C?J2>?^2?b ? )8 ]: )8 )8}9 :S:Cԟ9\:2>:3;Y;6;k}<R<\==Yn===>> '> >$>s!>>S >!>ˆ!>.&>FX>‚>b>i?0?e6?T? 8}9 )9 ]; A>a.>-/>(>%>*>0>L8>&>nM&>D*H>0U>k S>$}>f>(>>> 89C9P :t(:;S;},<[W= >d->E>/b>fg>S>@>V`7>6D>A>6,><`,>D>acC>n;#>r">>R>Ae> hS: )8 :; 8; )8)7>O&,>qN>a>}>r>r-O>e ;> N>M><)>l4>%>=>">Sު=Ȭ=== )9 hS9;2<<+<-<<==Z>>'<(>\>wЕ>> >Z>^>(c>V>Y>>L>< >T=q=ب==T= hS:j:b;;,;\Ԉ<<<=s\=n¥=U=K#>?p>t>:>Q >;|> P>[^>C>>> =V >M=Y===v= hS9 ]: 8{;ˬ;y;F}K>qP>Z>v4>o>*>j+> >j>Gs=eF= ><==y=== E: 3: 8 )9 )8 h9:q:;>=;@q;4;V;&:g: i:9: ף: i:m; H; :e;m<<~:}9 8 )8}9}9: : ; D>: 9 )8 )9 : ]:<;Z8;S;w;`;PG;>;F;mB;;^ܽ;FR;uA;<;ݙ;Ɏ;s|;s;W:;;֡;;>mF: )9 )9}9 9j : )9֧ ;:2:G::Ky:<uS< D9 H: 9 )8}9j : ף: h9 3:j : ): : : : : D>:j: 8 8 )8 8}9 95:{d:N\:~5:;::w:l; :g: H:: )8j:: )9 D9 8;ī;W;: )8 )8 H:;L; hS: : )9[#:0 E:S :f9@9J9a9^. ; )8 h9 )8 H: 9 )8;I;_;y;H < 8 898 8 :99 )9Y<:Qr<:ʰ9o99BN@9@9m3:}9!: D>: )8 )8}: )9yp;W; :;9;;;U; i.;9;8 ]: )8 8 )8 )9 9 hS: h9 : hS99*38\ j8+L9:8 9 )8:|;}9 D9}9 ף:K; H:}9gx; N;gx;9}9h: )89 D>:9 )8 D9 9 D99}9}9 838!884:ņ; h9!: ף: ):}: D: D: : ): )8 )8}9 hS9 9 8 )9j : D9}9 )98 D>;9 D9 D9}9X>67a`89 8;W; 9 D>: D9 : )8 h98 D9]:}: : 9 )8}9 hS9 )9 9 )86i6v8ag:gdalautotest-3.2.2/gdrivers/data/netcdf/uint16_netcdf4_without_fill.nc0000664000175000017500000003277714020414072024557 0ustar evenevenHDF  5`OHDR u" V 4GDAL_AREA_OR_POINTArea . ConventionsCF-1.5 PGDAL0GDAL 3.1.0dev-fe84eb7-dirty, released 2019/11/05 Yhistory9Tue Nov 05 17:03:52 2019: GDAL CreateCopy( test.nc, ... )\OHDR   egOCHKtD&transverse_mercatorFSSE_Rv6OHDR  ?@4 4  G 0CLASSDIMENSION_SCALE "NAMExDzOCHK <QOOCHK! 4 _Netcdf4Dimid  ?standard_nameprojection_x_coordinate B long_namex coordinate of projection !unitsmFRHP  (T@BTHDd( F_BTHD  d( "FSHDPx(C%%uYBTLF!6L X KX h20PD\J PVP`A[Y`מ`_B W` 8 ]CúY`X5{HCBTLF CY`P PY`h!6W`PX  _B -SOHDR  ?@4 4K  G 0CLASSDIMENSION_SCALE "NAMEyg'MOCHKW ry 9 OCHK: 4 _Netcdf4Dimid  ?standard_nameprojection_y_coordinate B long_namey coordinate of projection !unitsm:hLOCHK @ J_NCProperties"version=2,netcdf=4.7.0,hdf5=1.8.16FHDBtߌ spatial_refpPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]FHIB eFHDB1grid_mapping_nametransverse_mercatorlongitude_of_central_meridian ?@4 4@]false_easting ?@4 4Afalse_northing ?@4 4latitude_of_projection_origin ?@4 4!scale_factor_at_central_meridian ?@4 4x#? long_nameCRS definitionlongitude_of_prime_meridian ?@4 4semi_major_axis ?@4 4TXAinverse_flattening ?@4 4Uuor@ GeoTransform440720 60 0 3751320 0 -60 AAAAxAhAXAHA8A(AAAAAAAAAAALALALAݜLALALA7LAULAsLALALA͝LALA LA'LAELAcLALALALAskkkkksckk{{k{k{{cs{Jsc{csZcsZcckcck{kkkscscckssZ{skZkskZc{sss{{sck{ccsccs{c{c{{k{ckksskck{{{k{{ssZkkkkkc{s{c{kcs{{k{{{kccs{kksks{{k{{ss{s{{csc{ssk{s{{kssksc{cckc{sc{{ss{ksc{sksss{{{kk{{{s{s{s{ksksss{sks{kssksksk{ssk{{c{ck{skkk{sOHDR ( ?  P _Netcdf4Coordinates KOCHKxhBand1WOCHK : long_nameGDAL Band Number 1 ; grid_mappingtransverse_mercator `DIMENSION_LIST%%a OCHKG tREFERENCE_LISTdatasetdimension dOCHKG tREFERENCE_LISTdatasetdimension Q?RGCOL  hgdalautotest-3.2.2/gdrivers/data/netcdf/byte_with_neg_fillvalue_and_unsigned_hint.nc0000664000175000017500000000024014020414072027637 0ustar evenevenCDF xy Band1  _Unsignedtrue _FillValue~gdalautotest-3.2.2/gdrivers/data/netcdf/trmm.nc0000664000175000017500000002137414020414072020177 0ustar evenevenCDF  longitude(latitude(time CDIGClimate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi) ConventionsCF-1.4history^Wed Sep 07 22:33:59 2011: cdo sellonlatbox,-80,-70,-20,-10 tmp4-noc.nc tmp5.nc Wed Sep 7 22:33:53 2011: ncatted -a Conventions,global,d,, tmp4.nc tmp4-noc.nc Wed Aug 24 12:59:04 2011: ncatted -D 10 -a CoreMetadata.0,global,d,, -a ArchiveMetadata.0,global,d,, tmp3.nc tmp4.nc Tue Aug 23 21:04:45 2011: cdo seltimestep,1 tmp2.nc tmp3.nc Tue Aug 23 19:19:18 2011: cdo selvar,pcp tmp1.nc tmp2.nc Tue May 17 19:34:24 2011: cdo sellonlatbox,-85.25,-29.625,15.25,-50 3B43.2011.nc tmp1.nc Tue May 17 19:26:31 2011: cdo mergetime 3B43.110101.6A.nc 3B43.110201.6A.nc 3B43.110301.6A.nc 3B43.110401.6A.nc 3B43.2011.nccalendar standardcommentsbfile created by grads using lats4d available from http://dao.gsfc.nasa.gov/software/grads/lats4d/model geos/dascentergsfcCDOHClimate Data Operators version 1.5.2 (http://code.zmaw.de/projects/cdo)  longitude  standard_name longitude long_name Longitudeunits degrees_eastaxisX@tlatitude  standard_namelatitude long_nameLatitudeunits degrees_northaxisY@time  standard_nametimeunitshours since 2011-01-01 00:00:00calendarstandard pcp  long_nameprecipitation:Precipitation _FillValue?commentsUnknown1 variable comment grid_namegrid-1level_descriptionEarth surfacetime_statisticinstantaneous SSSSSSSSSxShSXSHS8S(SSRRRRRRRRRxRhRXRHR8R(RRQQQQQQQQ333`3 222`2 111`1 000`0 //@..@--@,,@++@**@))@((@''@&&@%%@$$@;8 ;W9 :>D 9D : 8) 9h 89D :]:}: 9 8) 9}9Sh 9) 9 8) 66i8v:ga;ň9h :!: :) :}:D :D : :) 8) 8) 9}9Sh 9 8 9) : j9D 9}9) 8;>D 99D 9D 9}6>X78`a989 8) :;|9}9D 9}: ;K:H 9};xg;N ;xg99}:h8) 9:>D 98) 9D 9 9D 99}9}8 838!8:49}:!:>D 8) 8) :}9) ;py;W:Í ;ň9;;;;U;.i 9;8:] 8) 8 8) 9) 9 :Sh 9h : 9Sh 983*8j \9L+:˨8) 9h 8) :H 9 8) ;;I;_;y< H8 8 988 : 999) :D :j8 8 8) 8 9}9 :ڻ5:d{:\N:5~:;::w;l:H 9) 8 9Sh 9}9) 9 9}:!:H 8 : ; j9:i :] ;{ :!8) :) :>D 9) 9) 9}9 : j9) ; ::2:G::yK<;RF;Au<;Š;;ɯ;|s;s;:W;;;Ͻ<ҫP8) : 8) 89Sh 9 ;h: j9}9}: :) ;ͳ$;;;;;;ɑ ;h;,y;^;;q<D 9}8 8) 9}9}:: ; :>D 9 8) 9) : :] ;<;8Z;S;w;`;GP;>;F;Bm;<^D :g:i 9:: :i ;m;H : ;e<m<<~< 7W<H<ڠ<ێ;q@;4;V<&=$Zg=l=^G=LC===|=&=^l=\]=ɨ=G==k=\=]==e l==z9Sh :] 8 ;{;˅;y<}F<~H<a >K>Pq>Z>4v>*>o>+j> >j=sG=Fe> =<=ˤ=y==:Sh :j;b;;,<\<뾋<⡹==\s=n=U>#K>p?>t>:> Q>|;>P >^[>C>>= > V=M=Y==ٔ=v9) 9Sh ;<2<<+<-<=ѡ=>Z>>(<'>\>w>> >Z>^>c(>V>Y>>L> <=T=q===T:Sh 8) : ;;8 8) <7);ԯu;q>>,&O>Nq>a>}>r>O-r>; e>N >M>)<>4l>%>=>"=S===8 9ٹ9C: P:(t;;S<,}<[`=W> >-d>E>b/>gf>S>@>7`V>D6>A>,6>,`<>D>Cca>#;n>"r>>R>eA8 9}9) ;] < :T:=:C;5Dx;o;Q~ ;S<_<+=+===[=i>&Y>A >.a>/->(>%>*ں>0>8L>&>&Mn>H*D>U0>S k>}$>f>(>>8) :] 8) 8) 9}: :S9C:\֮:>2;3;Y;6<}kƕ>>' > >$>!s>> S>!>!>&.>XF>>˦b?i?0Ҝ?6e?T9 ;:h:) 999T:AoF:};0{;09.a>']>'yb>$9>>iS>o>>@y7>{>`?V?C8?>2J?2^? b8) : 9 ;&{:!8:h:S2:: ;=$< i=<{(=]\=*=T7=u}=mU='=r=z>>6tM>Nf>G>>l>12>1ߴ>8>@J?T?? ?ݟ>I>;V ;[U:: :i:%::;#;,>>8>Uz>S>Eb> c=>>>Xm>>>>>I >^=><<,m;ň;# 8) ;sH:::B:&;7;S<= =6=8S=G==2>$>:>VG>PU>Q>]:>t>V>7>,>3G_>XK>y5>ep>m~>Q>4a>> D>]>np>i>v>9>ѩ>])>->4>>Jq>I4>e>qcM>B>>>[: :x:u:3:v/:[K;5;4e+;wg<#P=-,>g>yo>>q>z>ʝ>:>>k>>s>Y>_7f>W>K]>>%>%;cC <O:\:c:g:>;#;2;O;#>4.>AȨ>h_>o>>>>o>}r>wo>nN>g`>>~U>> >i>8;:j:7u:<;k,;I;v/;Ȑ<<=<>.^>2>>D >>,>M >>{V>X>])>bh>q9>|(>>d0>|>>>'8 ::0:W; U;PE;f;T\->/~>?>TR>>:>>O>>>l@>T>i >[z>]q>}>ő>^}k>L>Q[>h>:o3::Q{;Ye; <<cW>>?>h>>R>S><>?>,>>#>3>́>W> >a >4>y#>l'`>p>Vm>8) :p::;;/<^;2>>}q>>Ş>A>>}>>O>N>>,>>A>ye>>>>]>>> >:׭):;;M!W; <*<\<޵,=Nf2=}=I=\=>FZ>>>`>>k>>#>>>1>>=>V>r>>?.>Ȝ>>5>Bt>~>QN>ɍ:D;!;Z;z<35<4$<=O!_=[k=oa=z=N>y>jF>>Ƥ>ϒ> $>1>*>a>{]>xPq>>q>>>Y>>w>>>>>R>&gdalautotest-3.2.2/gdrivers/data/netcdf/swapedxy.nc0000664000175000017500000000115014020414072021052 0ustar evenevenCDF  LongitudeLatitude  ConventionsCF-1.0 Latitude units degrees_north long_nameLatitude_CoordinateAxisTypeLat Longitude units degrees_east long_name Longitude_CoordinateAxisTypeLon test  long_nametest coordinatesLongitude Latitude@(BA‡‡ABBC gdalautotest-3.2.2/gdrivers/data/netcdf/orog_CRCM2.nc0000664000175000017500000020267014020414072021054 0ustar evenevenCDF ycsxc historyvWed Dec 21 23:05:19 2011: ncks -x -v lat,lon orog_CRCM2.nc tmp2.nc Wed Dec 21 23:03:55 2011: ncatted -a coordinates,orog,d,, orog_CRCM2.nc Wed Dec 21 23:02:58 2011: ncatted -a scale_factor_at_projection_origin,polar_stereographic,c,d,0.9330127018922193 orog_CRCM2.nc Wed Dec 21 23:02:48 2011: ncatted -a standard_parallel,polar_stereographic,d,, orog_CRCM1.nc orog_CRCM2.ncNCO 20111222 orog  _FillValue grid_descpolar_stereographic grid_mappingpolar_stereographic long_nameSurface Altitude missing_value`x standard_namesurface_altitudeunitsm(polar_stereographic %straight_vertical_longitude_from_pole@pp false_eastingAJRHfalse_northingA\kdlatitude_of_projection_origin@Vgrid_mapping_namepolar_stereographicresolution_at_standard_parallel@j!scale_factor_at_projection_origin?=t,&Uxc axisX long_name.x-coordinate of polar_stereographic projection standard_nameprojection_x_coordinateunitsm0yc axisY long_name.y-coordinate of polar_stereographic projection standard_nameprojection_y_coordinateunitsmZhHm=g2Cf8ah%[i*k ( xz^ gHKwT+u $(Bz ^v'indE["cg6\b8 m `i@dUy1zIzUk\Kw]0  H6RbrX/, YxF5  0<Gu ~: n"  WW3  Tj+M;0~jC_J 6nvb!wKqv`V;*43# H $7A]k~@R>tfO*  lQ*zB1UG(& hR<'  HT L-5bLhnfce bRE/"$#{~L{q#] f9 2qCdE [i^A+  #!34&m06QO<c68*p';T_UBQ=wZC80& D`)^1DTKx~9]Im f)vSE@92.%  NA+.,_' bAb(P5Gl{aXI842492$ &#  X /T2S]; ykUE?=>>:/ .KG95,$#  S9&@9,bl$?4R7&$g\_YRH<3(5XZK?51+$+32-'!/Mf5z=A= z dTWCe";}YbpeUD7-'&!-CPWI=;,%09:84-,0.# /i 4F_("l'4m6blq\G:311+#".D[XRI2-6?HMHB@FN@-#H,*%m< BN+Vp~R,vun[G;891#+@ZljK14;BTec^\\f[@*Vo8"`(5"A82Vg?[WhieG(mZJ><:, &;[ui<'4BKXu}qma]UC0f('Dd 1zdvWnlMs\<tU1lVB795++*  6\oV47L^nx]G@=7!>;^AYG SAixG{wtiT>47/!1VdLE]s|oPC?;& 76LO1_h!W1a*7ZTU. pO:*4TTIci`UD, uE K^BNsLf^;O=El14 |#kkR;$ b6( $@cZS zoS7 1) Fjs9KW}V2 ^G4&)0Iprt zhL+ *ZpzU PCluE_Ev+ >X3R047Egx00C+~a7ERSM(19K p^-E?x}< lCr rA(/RjI r<9;=SoKX 3#kH'O*(GwpiKu^7|GZ 1}l7Jr_0TQ N:;:EdKr$E/kyf< #2riZl,|(]*n  z xIc\}8-['8pa!oA99B^z'{I)Q&V`tmry"{! * }  H@bq%3x?79-aaJ2`?6A`|n><yb(dA' 9M D5+q'p;fg  h!a<Hxil5<[oiO$eAFf}D2:h4 DyDz\Rea8Z;UO  # 4`^l)V% .GID<(a]mrvR~ }3|>"caag74N 1|k@Zj w Qhmf+c9   wsh[]v#F U Q+g?Bs2lI]OG : < A P`!9n Wc/zvcX^|,ZV&y]4 p66/pJK@%eg @ Q 4FPjHgeS(~yxulhu+A `< J^kj m   . H "|%f{ 9wdP7yr0b]a< wk 7U({ M   l D #$XG zdE"  g/kR1 x , 2Syzx U"BG $ l n{#>(f QtE,'jiA(3Ez$: a%)O6tw Gm{ | ~ 9HO"o'~9qFBJ:) D$y4# ' \up - uy sJKT*  ]  Ga6\7hN\l[: ('!eS@d =Rn/$ZA*z 0I" % N K AD DBBmb|T %-,  #)|4Qa2!J8kWT vO)nl2 < $    J1p?@Zw}}@ '3:,.F@o Xn- ;Bqo8A~0+ j, ebT . Z)0g6Z"xlD8& )H?@VK[ u? C|j)/PH{hBmX4lGWIUi0cWI~!w-iVV9" 0EQQh-q2|?%f{hp>9.bb, OfG>x._qW I.vfaH>=- + /HhFx1i+N r+5~ 4:c&jLSI|koidN*%/"%E@U%8}(P?o3b V \ j6f2HaVno>!-/ =6i (TS+ypcj':`} @ " u/Lll6L67NkU%+'RU['}2  ^^pZ  H o?K*o+jH(^1,.5@7  37  5 9HYf,,O4x8#FM2' (  WclV~-s%lO$rKEAA=20+BefA(e6H yq/]|/{Ou6<A% pp&DtS P]h]SE<KUv,de4o/Z|CV0DQ#$Ey@F (A.1j Zs f 36dY|@ MwV6XWzhL@Zwk+R![6wTSXyc*zM@ q9O<dKU  <'K{a\;P>ynEKn! Y3Q/Fo/ yR94rH@j uM_~kR-{@|a^@?<TKMRYfeIHD*^>$$Y5t]|<GL_ ?|njadKmXFS8tzn)%[F+K7pN..}n>S\6AarUDb`gSE,~eg`3P-`N"El~$9{v;fy *j8 H@D5qUR;6KsIDGI%\A`)$5=c,ajJ`dbet~"wF s Bgln65yuu; W%-L<=dxtnf5Y@cfZvg/3U{_a|*S3Y*DI- j*!W6hH627Sh`i4P}sV_n9& 'p cb7erlI_(wZqsfO]l?Y::(nD+D`[_J#[pYLMSC'30' OJgj: Va^WD&zQ {#F T"w8UiE f  "7F[d2.>F@CMN@)"#"*("2;LK5'$AdF ]i$@% 5D&FC)N4ZS& 66&$82ZsI))7?1 *588Lx^EBXx];qw56C}E'x/..lEIc=]3 2 3MO(Ulm{E2033**?ibw9UinQi8w@X!Xs1n"U@F  L9'(AkE':JC2,"{ TfpS/_f<fP5H'Kg)"O1@~!seO57n}7L#~ #(3],.B'zcds&]gM-{UE ms_LOj?pFd>[:>68_nG24F-=< - {^MCH]y&bz^ pb5@$=3|]oY B{B(E.^R3f '+/;*" $#K4y`E,"(?}1|> Q4tGR<fJ7Gf5(0D-*KVF!o3>  $ vfQ42y6xX _opJ16#0=V? x/_8;C[!v\kd W# {jF%JBjGy;]M  6/H"}  *; oPg[{5U2*xZ'W#Kg|VAn3 Pl16MMGn@VtN"omwN./"y1r@ b+>n +5)`}A]+* H_tz.zcR6 ARKW>0#}y~{r\)F ? ,YCQ[0~H3"j ,HLEMBwcND0-"fQ6#|mtppY5(l;.>WZWkf%+, .pfP* 'W+5|ijrnH]8$]Y~fMU? 9|0tE,` =;m R'Tysn6h8{^Vkx5O H h5x.9 'J`-Hkfna]|@ `?SwyU=8)a5QyhS>@T{fZ2gr"@d|`tZ}S, N+;SG&R9_UpRG\||V0,zje&Od*L}J +fZ&v~H)xjgL"  8  )+R%<68<cRj/ /wOxE* Qk\(- 0^;rulM{pr]7 e! "S${37IING=3)\?YC<(m!gV 5jG7{YWtia~'2zX3$"w7 } -X`pT9!$};DO ncl69/l+gw Uk&Rq1VF O B!!'4R0 =WK%HH;\OG8& Cui^m3BFpUbXL"! q#o#;;49a(FJbV'4d ;5IO6(# 85#9@r 3Q$v*0QSSfE'%hY<FAD^1??-R{)a-8%( 4Db LWf n TD#`M:NXfreAZ YZTCX-<=mRTL qq;g {uO* b!1s 3[eD"{h{Q,pt?6Z/ 1;e8trmZ4 r./ +o)*7|$_ {m!,KT@~G[vuU .ew\3o< /p i $ ws~l.'1JYDocE!^F$ F~fy@CrhU^H8qQ1?%*&Ae>/! eU6 9uC$1FeViA! :U(Qb.)K+N;l Gf]$xhG& d!9%QpzFB'o+nunW"  ~rL==2`L@9FVPgqg.L5Q80L.3uoaP2w^XIA<  Il7=C GJd:l<%#XmE}ktnhYP6p>?W\T># !6cH+_Z%W4'k1s@1T~em9 J}xnnljjFz~zdiM 'a\1 !#!WVsf<BkpZ.nX( -KtskmnppX d;4}"CL b^S?\_*Wsmpqql`1""\J #bou* rP -!fSi?v?Rpged`WO#3M818iL `1 `5RS~_SaOxzVZS8kq[LD=895J;KI-OF0Ns>>XQ>%? +S4h <Bqho2XCQrH('.2<kc?FqsP ?5>u)x qbyew2Zj757"W<8^>srN Hhmn`WRY%tpy]8e;3 1 N~$91 c2lOo"32Q>;.K7 C/h*i lE[Q 7#o$W4(43%d4%y\7F *7K~- %!T5OQY.8uV{  Aj'm2PU@$$50 OJ<? b(NJ86K)s x#9LyV&5."JOU5SDQ? =Z95C .a#Uso.F:9Qyf" $~W*}a[E4cUq+ N Z_D !0)g(:zd&m*biT/ u(f DYG+'Sr,*MG= TuRM^+ S`CgR%^p/CYry d? 2%,-BsvC:_zsLF :mJ8cYO%$76bn n5(dqZW 9ayS2xujaog  u92y9hyJH-#rOSJP2'/WdTCiA-.$O-U|"' S$?hsyGm$ .&kw'`L#2+>ke Z`{e`Wy|D!fMX89<e-\rc\spOM"0BG 4 +1~GBGp\ sr"fDv\lyfN8J71jCWSfBV Anr!:#s  9 6 ~YGCPGPH|HCPHt$H|HHPHۺH$IGI|II*I7ICPIOI[IgIt$I,IGIaI|IIIˀIIII5IPIjIυI՟IۺIԀII I$I>J,J9JGJ T@J aJnJ|J@JJJJ!@J$ˀJ'J*J-@J1J4 J7J:(@J=5J@BJCPJF]@JIjJLwJOJR@JUJXJ[J^@JaԀJdJgJj@Jn JqJt$Jw1@Jz>J}KJ,J J9J`JGJ͠JT@JJaJ JnJ`J|JJ@JJJ JJ*`JJ7J@JDJˀJR JJ_`JJlJ@JyJJ J J`JJJ(@JJ5J JBJ`JPJ֠J]@JJjJ JwJ`JυJ JҒ@JGCPGPH|HCPHt$H|HHPHۺH$IGI|II*I7ICPIOI[IgIt$I,IGIaI|IIIˀIIII5IPIjIυI՟IۺIԀII I$I>J,J9JGJ T@J aJnJ|J@JJJJ!@J$ˀJ'J*J-@J1J4 J7J:(@J=5J@BJCPJF]@JIjJLwJOJR@JUJXJ[J^@JaԀJdJgJj@Jn JqJt$Jw1@Jz>J}KJ,J J9J`JGJ͠JT@JJaJ JnJ`J|JJ@JJJ JJ*`JJ7J@JDJˀJR JJ_`JJlJ@gdalautotest-3.2.2/gdrivers/data/netcdf/uint.nc0000664000175000017500000002434114020414072020174 0ustar evenevenHDF  (0KǻOHDR,VVVV"  D ' ConventionsCF-1.5&transverse_mercatorkHOHDR-VVVV*( s+uFRHP  (z$/wBTHDd(I j}BTHD  d(I ]mFSHDKPx(I %%BTLFLKX Z20GD\JHV<I`A[6Wמ`< U 8 ]:úPWX5sNBTLF :PWGH6WZU<IL < FSSE Xу"$OHDR-VVVV ?@4 4*G +CLASSDIMENSION_SCALE NAMEx DWOCHK <gOCHK :standard_nameprojection_x_coordinate 9 long_namex coordinate of projection unitsmMFOHDR-VVVV ?@4 4*GV +CLASSDIMENSION_SCALE NAMEy @>xOCHK@yw }OCHK :standard_nameprojection_y_coordinate 9 long_namey coordinate of projection unitsmchOHDR-VVVV$   *(k 8 _FillValue (k 5 grid_mappingtransverse_mercator5OCHKxn Band1x 4]jOCHK( \DIMENSION_LISTVVYGCOLw w n OCHK( l0REFERENCE_LIST6datasetdimension x NOCHK( l0REFERENCE_LIST6datasetdimension x FHDBk spatial_refqPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]FHIB$z FFHDBBgrid_mapping_nametransverse_mercatorlongitude_of_central_meridian ?@4 4@]false_easting ?@4 4Afalse_northing ?@4 4latitude_of_projection_origin ?@4 4!scale_factor_at_central_meridian ?@4 4x#?longitude_of_prime_meridian ?@4 4semi_major_axis ?@4 4TXAinverse_flattening ?@4 4Uuor@ GeoTransform440720 60 0 3751320 0 -60 AALALA(k (k(kgdalautotest-3.2.2/gdrivers/data/netcdf/sombrero.grd0000664000175000017500000012264414020414072021226 0ustar evenevenCDF xeye  ConventionsCOARDShistory@grdmath -R-15/15/-15/15 -I0.3 X Y HYPOT DUP 2 MUL PI MUL 8 DIV COS EXCH NEG 10 DIV EXP MUL = sombrero.grd node_offset x  long_namex actual_range.@.y  long_namey actual_range.@.z  long_namez _FillValue actual_range,?d@pk33fffa\XS33NffID@;336ff1,(#33ff 33ffff33əff33ffyfffS33@,fffffff>??fff???ff@ff@@,@@@S33@fff@y@ff@@@33@@ff@@ə@33@@ff@@AAffA 33AAAAffA#33A(A,A1A6ffA;33A@ADAIANffAS33AXA\AaAfffAk33Appk33fffa\XS33NffID@;336ff1,(#33ff 33ffff33əff33ffyfffS33@,fffffff>??fff???ff@ff@@,@@@S33@fff@y@ff@@@33@@ff@@ə@33@@ff@@AAffA 33AAAAffA#33A(A,A1A6ffA;33A@ADAIANffAS33AXA\AaAfffAk33Ap;켽7Ծ  ٽ$։ݽo!x)&;ji="i==٠}=Y >>k#>*>49>=v>Dä>J >>MT>O?>Pk3>O>NRu>K>H?>E>A>8K>4e>0k>,>)>&M>$q>" >!">!B>!">" >$q>&M>)>,>0k>4e>8K>A>E>H?>K>NRu>O>Pk3>O?>MT>J >>Dä>=v>49>*>k#>=Y =٠}=="i=>RVa  => >)>5zj>>~>FRJ>Kw>N>PR>P>NRu>K@>G>A><3M>5>/P>(>!">d>8>~y> R>>===K= =K==>>> R>~y>8>d>!">(>/P>5><3M>A>G>K@>NRu>P>PR>N>Kw>FRJ>>~>5zj>)> > ==0=C =?=qF=QqxpK<2! i  7 DH <jy 9/˼/===)e>x>>'>30>>p>Fu8>Lo>OW>Pk>Ou3>L>H3>BYo>;R>3\>*[>!B>*>>a==q=׀=R=ϫ====E=D==D=E====ϫ=R=׀=q=>a>>*>!B>*[>3\>;R>BYo>H3>L>Ou3>Pk>OW>Lo>Fu8>>p>30>'>>x=)e===@<>-^ѽ켽7Kz> BJ .d5tr0 5}"J$(P;=s=d=J=F=Ϯ>>!>05><.>E2>Kw>OK>Pj>O[>K.>F>>U>5>+> >8)> ===n==Y==fڱ=DE7=%k= s >8)> >+>5>>U>F>K.>O[>Pj>OK>Kw>E2><.>05>!>=Ϯ=F=J=d=s;ƼP$(}"J 50r5t .d BJz>K7Ծ< 7 .d (\3[p7cBGY*!>H>)>7>BQ>J >>N>Ph>OD>KwZ>E=>2>&U>> ==S==)= =H= >>&U>2>E=>KwZ>OD>Ph>N>J >>BQ>7>)>H>*!=ᐹ===I o> `'>0o4>=\>F>MCE>P->O%>L^%>F>=>1ƒ>$q>z>a=q=v==x=1#a>z>$q>1ƒ>=>F>L^%>O%>P->MCE>F>=\>0o4> `'> o===S=3<)½Kgz׽ҽ߽刃 5t D  ir(߽-cŻ|<<3=DoY=c=ˑ=rV>P >&J>5z>AI>J]>O2>P\>M>H3>?Q{>3>%w >8>F=='=Lh=HoXKҽ )"q \];1[ # j #1[;\]q )"KҽX>oμ,V$<"UF>8>%w >3>?Q{>H3>M>P\>O2>J]>AI>5z>&J>P =rV=ˑ=c=DoY<<3|Žc-߽(r i 2!H \3ҽcڻ<=Oq==Ӡ>!>>*3>9=>E2>L>P'0>O>K@>C<>7>)>>a====/+o\ԢDJ |Sb$/8x@lGþLQT UëVW_UëT QLGþ@l8x/$Sb |JԢD\>o CSa>>)>7>C<>K@>O>P'0>L>E2>9=>*3>>!=Ӡ==Oq<ϻڽcҽ\3H 2! <<0[gz׼Ż=c>:c>-><ϧ>G>N5r>Pk}>NRx>H>=>0%E>5> =3=ϫ==,Ͻ< X RnlȽIݽϽо"߾2Ǿ@`M"X:b2gjWɾq*ve{4d~x{+fѾ+x{~{4dveq*jWɾb2gX:M"@`2Ǿ"߾нϽIݽlȽ Rn X<=,Ͻ==ϫ=3> >5>0%E>=>H>NRx>Pk}>N5r>G><ϧ>->:c>=c=X=1=U?U>k#>04>>u>I[V>O%>PBi>L>D>8K>(>8==(==AN<¼ Dڽ~Ž-) | #3EUëc8>(>8K>D>L>PBi>O%>I[V>>u>04>k#>=۞C=?=U?U<ϻ|Kp7 5jK ٽpy }"Jc<<3=Oq=1=۞C>>N>1>@Y>Jx>Or>O>K%(>A>3>!B> x=}=5=mp}ݾRGc}ݾ(Hq v}. x>!B>3>A>K%(>O>Or>Jx>@Y>1>N>=۞C=1=Oq<<3½c}"Jy pٽ$x$(BGY<)=DoY==X>>N>2>A>K>O>O>I>>>/P>d>=ѳ=D=1#>d>/P>>>I>O>O>K>A>2>N>=X==DoY<)BGY$(x$։>9/˼P=c>k#>1>A>KL >P>O7&>H?>+>UH==(=<ԻCSŽ , %j@lY5nx*fibH㳾YھϨk供V~AҾsZuc쾒ncnc쾔uZsҾAV~k侚ϨYھ㳾Hib*fxnY5@l%j o, CS<==(=>UH>+>H?>O7&>P>KL >A>1>k#>=c=Ӡ=c=3։ݽRVa;=I=S=ˑ>!>:c>04>@Y>K>P>O[>H3>;t>)>f=H==]b<¼OWQA;8jTkf>)>;t>H3>O[>P>K>@Y>04>:c>!=ˑ=S=I;ƼRVaݽo!x/=s===rV>>->>u>Jx>O>O7&>H3>; >(G>E=q=9=A<8T(U{X- )*n(H0c<{4dV龏䋾̆kqj[,ɾ2 1⾂Ծ{"*qf>h[O`DOYY־SɯOHM;ӾLfgM;ӾOHSɯYY־`DOh[Oqf>{"*Ծ⾌12 ,ɾ[jqk̆䋾V{4dcE>(G>; >H3>O7&>O>Jx>>u>->=rV===s/żo!x) P >*3><ϧ>I[V>Or>O>H?>;t>(G>~y={==/+;: Rnơ i7Uëps+ݾ^䂾j2y~5N{r\cABTFx9=c-1"! T . ! . T !"-19=cFxTcABr\N{5~y2j䂾^ݾ+psUë7 iơ Rn;:=/+=={>~y>(G>;t>H?>O>Or>I[V><ϧ>*3>P ===d=J=ᐹ> o>&J>9=>G>O%>O>I>)>E={=)=%0:#ν:н۾1[@l_Yz}^X㳾a vBKuZrv cABO8;(kбLνyzlRg llRzyνLб(k;O8cABv rZKuvBa 㳾X^z}_Y@l1[۽:н:#=%0=)={>E>)>I>O>O%>G>9=>&J> o=ᐹ=J=@<>*!> `'>5z>E2>N5r>PBi>K%(>>>+>f=q==%09)/Y!$H6g+㐾ֶJ|H y2qf>ZC*W"zy–X'L nu_<02y HJ|ֶ㐾+gH6$Y!)/9=%0==q>f>+>>>K%(>PBi>N5r>E2>5z> `'>*!=F==Qq;jiH>0o4>AI>L>Pk}>L>A>/P>UH=H=9=/+:#ν)/(9Lulibƾ6 s<Ҿ,Ⱦ־ھsgZ!>!б0r <<=O=(=+A=ı{=؟==v=Q=v==؟=ı{=+A=(=O<< 0rб!>Z!sgھ־,ȾҾs<6 ƾiblLu(9佬)/:#=/+=9=H>UH>/P>A>L>Pk}>L>AI>0o4>H=Ϯ==qF=?=)e>>)>=\>J]>P'0>NRx>D>3>d===A;:Y!)ʭOY{p!ľ4徚䂾+(̾r2{ta޾C"+lRƂ<=!=Z==v> 3>0>/z>F\>Mr>Q>S>Q>Mr>F\>/z>0> 3=v==Z=!<ƂlR+"Ca޾{t2r(̾+䂾4徐󾅥p!ľOY{)ʭ佩Y!;:=A==>d>3>D>NRx>P'0>J]>=\>)>=)e=?=>="i=C >x>!>7>F>O2>O>H>8K>!B>=(=]b<8T( Rn:н(9OY{q*; 8(BynBOH-1–g l>6>N>cS>v0>>>GO>>>1>>>GO>>>v0>cS>N>6>==U=eD>!B>8K>H>O>O2>F>7>!>x=C ="i==0>>05>BQ>MCE>P\>K@>=>(> x=ѳ=<¼U{۾$Lup!ľ;]^^YKvP21EcAB@c!0yƁ[<=vb=:#> 3>09>Q>on>>>>σ>>>>`>W>>W>`>>>>σ>>>>on>Q>09> 3=:#=vb<Ɓ[y0!@ccABE1P2KvY^]^;p!ľLu$۽U{<==ѳ> x>(>=>K@>P\>MCE>BQ>05>=0==٠}> =>'><.>J >>P->M>C<>0%E>8=}=D<ԼOWXơ1[H6l ^b `u{"Z!3& !0;=O=ı{>>8"4>^[>}>>q>Y>>8>X>J>n>~{>З>>7>>З>~{>n>J>X>8>>Y>q>>}>^[>8"4>=ı{=O;0 !3&Z!{"u `b^ lH61[ơXOW<=D=}>8>0%E>C<>M>P->J >><.>'> ==٠}=Y > >30>E2>N>O%>H3>7>5==5=1#CSŽQA- i@lgY `)xwTwSɯ*W"o߼#U<=>d>09>\\>>~>E>>T>ѧ>~x>ԏ>=>>ܿx>K>,>7v>>>>7v>,>K>ܿx>=>>ԏ>~x>ѧ>T>>E>~>>\\>09>d=<㥼#U߽o*W"SɯwTw뾔)x `Yg@l i-QACS=1#=5=>5>7>H3>O%>N>E2>30> =Y >>)>>p>Kw>Ph>L^%>?Q{>)> =(=mp>Mr>{>>d>`>X>>Q'>Q>y>k>>$>^>T>>/>u>/>>T>^>$>>k>y>Q>Q'>>X>`>d>>{>Mr>=9=?\z^L$4Pev 뾔uKv8(4徎ib+_Y7 ) >)>?Q{>L^%>Ph>Kw>>p>)>>k#>5zj>Fu8>OK>OD>F>3>=3=/z>cF>h>SB>>o>>>>k>6>ԑ>>>>C>>>>߽>q>߽>>>>C>>>>ԑ>6>k>>>>o>>SB>h>cF>/z=v=v1;4"]!"PewTwP2B䂾ƾ㐾z}Uë*n(򂽏,'*>3>F>OD>OK>Fu8>5zj>k#>*>>~>Lo>Pj>KwZ>=>%w >a=ϫ=AN.S9;H0ps^ֶ6 +1{"Sɯ$4S+<0=(>,>=A>t>1>Y>>>)>K>伹>q>u>J>Xi>q>l>։J>R>εg>>5>ɞ>5>>εg>R>։J>l>q>Xi>J>u>q>伹>K>)>>>Y>1>t>=A>,=(<0S+$4Sɯ{"1+6 ֶ^psH0;S9.=AN=ϫ>a>%w >=>KwZ>Pj>Lo>>~>*>49>FRJ>OW>O[>E=>1ƒ>8==<¼}Y! 8jc<+Xs<(̾EZ!*W"L]!<0=Ǹ>n>F\>@>>$>x>>ܿx>k>_>籽>C>>D>м>m>¸>>8>>L >>g>>L >>8>>¸>m>м>D>>C>籽>_>k>ܿx>>x>$>>@>F\>n=Ǹ<0]!L*W"Z!㾀E(̾s8>1ƒ>E=>O[>OW>FRJ>49>=v>Kw>Pk>K.>$q>F==,Ͻ v)%jT{4dݾ㳾J|ҾrycAB3&oz^;4"=(>n>I2>>q>`>v>m+>}>Q>>引>R>@>*>¸>&>L >>h>7>>y>r>pF>r>y>>7>h>>L >&>¸>*>@>R>引>>Q>}>m+>v>`>q>>I2>n=(;4"z^o3&cAByrҾJ|㳾ݾ{4dT%j)v =,Ͻ=>F>$q>K.>Pk>Kw>=v>Dä>N>Ou3>F>2>z==<Dڽ!@lkV龓a H,Ⱦ2nB@c !߻\=v1>,>F\>>->>ʈ">=>>>q>=>>D>εg>">=>bf> >~7>_p>C>+r>v> `>1~=T>1~> `>v>+r>C>_p>~7> >bf>=>">εg>D>>=>q>>=>>ʈ">>->>F\>,=v1\߾ !@cnB2,ȾHa Vk@l!D<==>z>2>F>Ou3>N>Dä>J >>PR>L>>U>&U>a='=/+ X~Ž*n6Y5=A>@>q>>n>ڐn>>ԑ>)I>q>Ao>QB>n,>q>7>i">>j>w=+=wm=Ow>>j>i">7>q>n,>QB>Ao>q>)I>ԑ>>ڐn>n>>q>@>=A=v=?#U!OH{t־ vB^a>&U>>U>L>PR>J >>MT>P>H3>5>=q=Lh/z>t>>`>ʈ">ڐn>d>T>C>>>F>9>>>ki>6:>1o=wm=D<ÿ^񭾾0񭾽^ÿ<=D=wm>1o>6:>ki>>>9>>F>>C>T>d>ڐn>ʈ">`>>t>/z=9<㥽00-1a޾ھyKu䂾䋾ƐnB˾q - Rn>5>H3>P>MT>O?>NRu>BYo>+> =v=H섻CSŽlȽ)(HXFx̆jZsgCy;=>>cF>1>$>v>=>>>T>z>h>>SQ>>>H> `=U<}!m޽ھ 2SϾm ]t] mSϾ2 ླྀڽ!m<}=U> `>H>>>SQ>>h>z>T>>=>>v>$>1>cF>=;yCsgZj̆xXF(H)lȻCS=H=v> >+>BYo>NRu>O?>Pk3>K@>;R> ==}ݾk*fӾkr2Z!"–Ɓ[=O>d>Mr>h>Y>x>m+>>ԑ>C>h>m>8>#>r>. =>=D"^$"[f뾪8avǬva8뾅f[$"^"=D=>>. >r>#>8>m>h>C>ԑ>>m+>x>Y>h>Mr>d=OƁ[–"Z!㾂2rkӾ*fk>}ݾ |齥Iݼ >;R>K@>Pk3>O>G>3\>8)=S=x<"U>oϾ #RG|۾ib^q2qf>>g l<=ı{>09>{>SB>>>}>q>)I>>>8>>i">Vn=wm1%ÿ>W^Ίܾ7Eg¾y'y¾Eg7ܾ^Ί>Wÿ1%=wm>Vn>i">>8>>>)I>q>}>>>SB>{>09=ı{qf>2q^ib|۾RG #Ͻ>o<"U=x=S>8)>3\>G>O>NRu>A>*[> ==1#,V$\3c>\\>>>>ܿx>Q>=>q>>F>SQ>#>i">v=̀/E+=]Ǭ)}(1G  0Z)δ)0Z G(1)}Ǭྨ]=+/E=̀>v>i">#>SQ>>F>q>=>Q>ܿx>>>>\\>=vb+!ZyjHmc<3\,V$=1#=> >*[>A>NRu>K><3M>!B==)8"4>>d>o>)>k>>>Ao>9>>r>Vn=̀#񭚾Sྔl ƾty‰(rQn"%B$tǿ%&"%$tǿ"%BQn(r‰ytƾl S񭚼#=̀>Vn>r>>9>Ao>>>k>)>o>d>>8"4=:#!B><3M>K>H?>5>*== <$@>oԢD"߾Uë 3>^[>~>`>>K>_>引>D>QB>>>. =wm/E񭚾[ƿFx O"%B&`)1+ ,`,,ѿ,,`+ )1&`"%B OxFƾ[񭚼/E=wm>. >>>QB>D>引>_>K>>`>~>^[> 3=eDƂ*W"cAB5,ɾ2þYھo<$@= =>*>5>H?>E>/P>=n=H섻eXJ2Ǿc<ֶϨ `2 N{O8zཐ<=U>09>}>E>X>>伹>籽>R>εg>n,>>H=>1%+SྛxD δ 'I+$Z,ѿ,㰿,+*/)*/+,,㰿,ѿ+$Z'I δ xDS+1%=>>H>>n,>εg>R>籽>伹>>X>E>}>09=U<zO8N{2 `Ϩֶc<2ǽJXe=H=n>>/P>E>A>(>a=='* |@`p!ľo k侘(̾1r\;y0r=!=>Q>>>>>q>C>@>">q>ki> `=Dÿ=l  FQl#L)1,,*|U'ֿ#T{LxL#T{'ֿ*|U,,)1#LQl Fl =ÿ=D> `>ki>q>">@>C>q>>>>>Q==!0ry;r\1(̾k侖 op!ľ@` |'*==>a>(>A>!"==Y>on>q>T>Q'>k>u>>*>=>7>6:=U">W]ƾƿ Ql$tǿ*E,+Hf&>EV awY8wY aVE&>+Hf,*E$tǿQl ƾƾ]>W"=U>6:>7>=>*>>u>k>Q'>T>q>on>=Z –(kcAB⾕V~ibzsM"SbKҽ Rn!">8K>d=q=6>>Y>ѧ>Q>6>J>D>¸>bf>i">1o<}^^ΊtFδ#L*E,*/#T{wW ܿԀo۹46846۹oԀ ܿwW#T{*/,*E#LδFt^Ί^<}>1o>i">bf>¸>D>J>6>Q>ѧ>Y>>6=<TԾ|A۾ӾX:$;d>8K>4e>8=׀=fڱ:#νiiݽ/b2grkҾ^{"*FxбX'L<=v>N>>>~x>y>ԑ>Xi>м>&> >>j=wm!m޾$"ܾǬyx )1,*/"v 8(辩龑a xTa (8 "v*/,)1 xyǬྎܾ$"!m=wm>>j> >&>м>Xi>ԑ>y>~x>>>N=v<X'LбFx{"*^Ҿkrb2g/ii:#=fڱ=׀>8>4e>0k>~y=R=DE7 ;8xjWɾƐƾYsڋqf>9=cL n=O> 3>cS>>8>ԏ>k>>>q>m>L >~7>w=Dھ[7)}‰ O'I,+Hf#T{ H۹5f4M?M45f۹H #T{+Hf,'I O‰)}7[=D>w>~7>L >m>q>>>k>ԏ>8>>cS> 3=O nL9=cqf>ڋsYƾƐjWɾ8x; =DE7=R>~y>0k>,> R=ϫ=%k]w )"@lq*RҾO]vZh[O-1=(>0>v0>σ>X>=>>>>l>¸>>_p=+ ྅fEg(1(r"%B+$Z,&>wW8۹W½@=h/=$>=$=h/@W¾۹8wW&>,+$Z"%B(r(1Egf =+>_p>>¸>l>>>=>>X>σ>v0>0=(-1h[O뾗ZvO]RҾq*@l )"w]=%k=ϫ> R>,>)>== sTjY!q GþveZ^_r5`DO"u_=+A>/z>>>J>ܿx>$>C>։J>>h>C=wm<2GQn&`,ѿ*|U ܾ5fW½=Q>(/~>Y>D>S>D>Y>(/~=Q㽝W¾5f ܿ*|U,ѿ&`QnG2<=wm>C>h>>։J>C>$>ܿx>J>>>/z=+Au_"`DO5_r^ZveGþq Y!Tj= s=>>)>&M>=>>n>K>^>>R>8>7>+r=OÿSϾ8¿ )1,㰿'ֿEԀ(辁=Q>K>S>R>49?u%>49>R>S>K=Q(ԀE'ֿ,㰿)1 ¾8SϽÿ=O>+r>7>8>R>>^>K>n>>>>&M>$q==<;Ž Rn;;Q~󾙣Hc쾂8SɯyF\>GO>>~{>,>T>>εg>>>v(/~>S>??+"?1?+"?>>S>(/~@4oV#T{,+ "%B am^v>>>εg>>T>,>~{>>GO>F\=؟$q>" ==E<ʽR1[T x{XBA{OH T z<'=>Mr>>`>З>7v>>>>L >y> `Y>R??8ڧ?N0?Vv?N0?8ڧ?>R>Y=h/Ma ۹ a+,`$tǿ0Zyv `>y>L >>>>7v>З>`>>Mr=<'z T OH{ABXx{T 1[R<=E=>" >!"=K=D<½ #Uë+]['(nEM;Ӿ .lR<=v>Q>>W>>>/>߽>5>>r>1~;S6])%,*/LwY46=$>D>49?+"?N0?gަ?q?gަ?N0?+">49>D=$46wYL*/,%)];S6>1~>r>>5>߽>/>>>W>>Q=v<lR .M;ӾEn'(][+Uë #<=D=K>!">!B= =<ٽ!3"- jVW_fѾӾ6 jcN{Lfg !g l<Ӛ=Q>S>1>>7>>u>q>ɞ>g>pF=T1%0tǬ'δ&",ѿ)x88xT?>>S?u%?1?Vv?q??q?Vv?1?u%>S>?xT88x),ѿ&"δ'Ǭ྇t01%=T>pF>g>ɞ>q>u>>7>>1>S=Q<Ӛg l !LfgN{cj6 ӾfѾVW_ j-!3"<== >!B>!"=K=D<½ #Uë+]['(nEM;Ӿ .lR<=v>Q>>W>>>/>߽>5>>r>1~;S6])%,*/LwY46=$>D>49?+"?N0?gަ?q?gަ?N0?+">49>D=$46wYL*/,%)];S6>1~>r>>5>߽>/>>>W>>Q=v<lR .M;ӾEn'(][+Uë #<=D=K>!">" ==E<ʽR1[T x{XBA{OH T z<'=>Mr>>`>З>7v>>>>L >y> `Y>R??8ڧ?N0?Vv?N0?8ڧ?>R>Y=h/Ma ۹ a+,`$tǿ0Zyv `>y>L >>>>7v>З>`>>Mr=<'z T OH{ABXx{T 1[R<=E=>" >$q==<;Ž Rn;;Q~󾙣Hc쾂8SɯyF\>GO>>~{>,>T>>εg>>>v(/~>S>??+"?1?+"?>>S>(/~@4oV#T{,+ "%B am^v>>>εg>>T>,>~{>>GO>F\=؟$q>&M>=>>n>K>^>>R>8>7>+r=OÿSϾ8¿ )1,㰿'ֿEԀ(辁=Q>K>S>R>49?u%>49>R>S>K=Q(ԀE'ֿ,㰿)1 ¾8SϽÿ=O>+r>7>8>R>>^>K>n>>>>&M>)>== sTjY!q GþveZ^_r5`DO"u_=+A>/z>>>J>ܿx>$>C>։J>>h>C=wm<2GQn&`,ѿ*|U ܾ5fW½=Q>(/~>Y>D>S>D>Y>(/~=Q㽝W¾5f ܿ*|U,ѿ&`QnG2<=wm>C>h>>։J>C>$>ܿx>J>>>/z=+Au_"`DO5_r^ZveGþq Y!Tj= s=>>)>,> R=ϫ=%k]w )"@lq*RҾO]vZh[O-1=(>0>v0>σ>X>=>>>>l>¸>>_p=+ ྅fEg(1(r"%B+$Z,&>wW8۹W½@=h/=$>=$=h/@W¾۹8wW&>,+$Z"%B(r(1Egf =+>_p>>¸>l>>>=>>X>σ>v0>0=(-1h[O뾗ZvO]RҾq*@l )"w]=%k=ϫ> R>,>0k>~y=R=DE7 ;8xjWɾƐƾYsڋqf>9=cL n=O> 3>cS>>8>ԏ>k>>>q>m>L >~7>w=Dھ[7)}‰ O'I,+Hf#T{ H۹5f4M?M45f۹H #T{+Hf,'I O‰)}7[=D>w>~7>L >m>q>>>k>ԏ>8>>cS> 3=O nL9=cqf>ڋsYƾƐjWɾ8x; =DE7=R>~y>0k>4e>8=׀=fڱ:#νiiݽ/b2grkҾ^{"*FxбX'L<=v>N>>>~x>y>ԑ>Xi>м>&> >>j=wm!m޾$"ܾǬyx )1,*/"v 8(辩龑a xTa (8 "v*/,)1 xyǬྎܾ$"!m=wm>>j> >&>м>Xi>ԑ>y>~x>>>N=v<X'LбFx{"*^Ҿkrb2g/ii:#=fڱ=׀>8>4e>8K>d=q=6>>Y>ѧ>Q>6>J>D>¸>bf>i">1o<}^^ΊtFδ#L*E,*/#T{wW ܿԀo۹46846۹oԀ ܿwW#T{*/,*E#LδFt^Ί^<}>1o>i">bf>¸>D>J>6>Q>ѧ>Y>>6=<TԾ|A۾ӾX:$;d>8K>!"==Y>on>q>T>Q'>k>u>>*>=>7>6:=U">W]ƾƿ Ql$tǿ*E,+Hf&>EV awY8wY aVE&>+Hf,*E$tǿQl ƾƾ]>W"=U>6:>7>=>*>>u>k>Q'>T>q>on>=Z –(kcAB⾕V~ibzsM"SbKҽ Rn!">A>(>a=='* |@`p!ľo k侘(̾1r\;y0r=!=>Q>>>>>q>C>@>">q>ki> `=Dÿ=l  FQl#L)1,,*|U'ֿ#T{LxL#T{'ֿ*|U,,)1#LQl Fl =ÿ=D> `>ki>q>">@>C>q>>>>>Q==!0ry;r\1(̾k侖 op!ľ@` |'*==>a>(>A>E>/P>=n=H섻eXJ2Ǿc<ֶϨ `2 N{O8zཐ<=U>09>}>E>X>>伹>籽>R>εg>n,>>H=>1%+SྛxD δ 'I+$Z,ѿ,㰿,+*/)*/+,,㰿,ѿ+$Z'I δ xDS+1%=>>H>>n,>εg>R>籽>伹>>X>E>}>09=U<zO8N{2 `Ϩֶc<2ǽJXe=H=n>>/P>E>H?>5>*== <$@>oԢD"߾Uë 3>^[>~>`>>K>_>引>D>QB>>>. =wm/E񭚾[ƿFx O"%B&`)1+ ,`,,ѿ,,`+ )1&`"%B OxFƾ[񭚼/E=wm>. >>>QB>D>引>_>K>>`>~>^[> 3=eDƂ*W"cAB5,ɾ2þYھo<$@= =>*>5>H?>K><3M>!B==)8"4>>d>o>)>k>>>Ao>9>>r>Vn=̀#񭚾Sྔl ƾty‰(rQn"%B$tǿ%&"%$tǿ"%BQn(r‰ytƾl S񭚼#=̀>Vn>r>>9>Ao>>>k>)>o>d>>8"4=:#!B><3M>K>NRu>A>*[> ==1#,V$\3c>\\>>>>ܿx>Q>=>q>>F>SQ>#>i">v=̀/E+=]Ǭ)}(1G  0Z)δ)0Z G(1)}Ǭྨ]=+/E=̀>v>i">#>SQ>>F>q>=>Q>ܿx>>>>\\>=vb+!ZyjHmc<3\,V$=1#=> >*[>A>NRu>O>G>3\>8)=S=x<"U>oϾ #RG|۾ib^q2qf>>g l<=ı{>09>{>SB>>>}>q>)I>>>8>>i">Vn=wm1%ÿ>W^Ίܾ7Eg¾y'y¾Eg7ܾ^Ί>Wÿ1%=wm>Vn>i">>8>>>)I>q>}>>>SB>{>09=ı{qf>2q^ib|۾RG #Ͻ>o<"U=x=S>8)>3\>G>O>Pk3>K@>;R> ==}ݾk*fӾkr2Z!"–Ɓ[=O>d>Mr>h>Y>x>m+>>ԑ>C>h>m>8>#>r>. =>=D"^$"[f뾪8avǬva8뾅f[$"^"=D=>>. >r>#>8>m>h>C>ԑ>>m+>x>Y>h>Mr>d=OƁ[–"Z!㾂2rkӾ*fk>}ݾ |齥Iݼ >;R>K@>Pk3>O?>NRu>BYo>+> =v=H섻CSŽlȽ)(HXFx̆jZsgCy;=>>cF>1>$>v>=>>>T>z>h>>SQ>>>H> `=U<}!m޽ھ 2SϾm ]t] mSϾ2 ླྀڽ!m<}=U> `>H>>>SQ>>h>z>T>>=>>v>$>1>cF>=;yCsgZj̆xXF(H)lȻCS=H=v> >+>BYo>NRu>O?>MT>P>H3>5>=q=Lh/z>t>>`>ʈ">ڐn>d>T>C>>>F>9>>>ki>6:>1o=wm=D<ÿ^񭾾0񭾽^ÿ<=D=wm>1o>6:>ki>>>9>>F>>C>T>d>ڐn>ʈ">`>>t>/z=9<㥽00-1a޾ھyKu䂾䋾ƐnB˾q - Rn>5>H3>P>MT>J >>PR>L>>U>&U>a='=/+ X~Ž*n6Y5=A>@>q>>n>ڐn>>ԑ>)I>q>Ao>QB>n,>q>7>i">>j>w=+=wm=Ow>>j>i">7>q>n,>QB>Ao>q>)I>ԑ>>ڐn>n>>q>@>=A=v=?#U!OH{t־ vB^a>&U>>U>L>PR>J >>Dä>N>Ou3>F>2>z==<Dڽ!@lkV龓a H,Ⱦ2nB@c !߻\=v1>,>F\>>->>ʈ">=>>>q>=>>D>εg>">=>bf> >~7>_p>C>+r>v> `>1~=T>1~> `>v>+r>C>_p>~7> >bf>=>">εg>D>>=>q>>=>>ʈ">>->>F\>,=v1\߾ !@cnB2,ȾHa Vk@l!D<==>z>2>F>Ou3>N>Dä>=v>Kw>Pk>K.>$q>F==,Ͻ v)%jT{4dݾ㳾J|ҾrycAB3&oz^;4"=(>n>I2>>q>`>v>m+>}>Q>>引>R>@>*>¸>&>L >>h>7>>y>r>pF>r>y>>7>h>>L >&>¸>*>@>R>引>>Q>}>m+>v>`>q>>I2>n=(;4"z^o3&cAByrҾJ|㳾ݾ{4dT%j)v =,Ͻ=>F>$q>K.>Pk>Kw>=v>49>FRJ>OW>O[>E=>1ƒ>8==<¼}Y! 8jc<+Xs<(̾EZ!*W"L]!<0=Ǹ>n>F\>@>>$>x>>ܿx>k>_>籽>C>>D>м>m>¸>>8>>L >>g>>L >>8>>¸>m>м>D>>C>籽>_>k>ܿx>>x>$>>@>F\>n=Ǹ<0]!L*W"Z!㾀E(̾s8>1ƒ>E=>O[>OW>FRJ>49>*>>~>Lo>Pj>KwZ>=>%w >a=ϫ=AN.S9;H0ps^ֶ6 +1{"Sɯ$4S+<0=(>,>=A>t>1>Y>>>)>K>伹>q>u>J>Xi>q>l>։J>R>εg>>5>ɞ>5>>εg>R>։J>l>q>Xi>J>u>q>伹>K>)>>>Y>1>t>=A>,=(<0S+$4Sɯ{"1+6 ֶ^psH0;S9.=AN=ϫ>a>%w >=>KwZ>Pj>Lo>>~>*>k#>5zj>Fu8>OK>OD>F>3>=3=/z>cF>h>SB>>o>>>>k>6>ԑ>>>>C>>>>߽>q>߽>>>>C>>>>ԑ>6>k>>>>o>>SB>h>cF>/z=v=v1;4"]!"PewTwP2B䂾ƾ㐾z}Uë*n(򂽏,'*>3>F>OD>OK>Fu8>5zj>k#>>)>>p>Kw>Ph>L^%>?Q{>)> =(=mp>Mr>{>>d>`>X>>Q'>Q>y>k>>$>^>T>>/>u>/>>T>^>$>>k>y>Q>Q'>>X>`>d>>{>Mr>=9=?\z^L$4Pev 뾔uKv8(4徎ib+_Y7 ) >)>?Q{>L^%>Ph>Kw>>p>)>=Y > >30>E2>N>O%>H3>7>5==5=1#CSŽQA- i@lgY `)xwTwSɯ*W"o߼#U<=>d>09>\\>>~>E>>T>ѧ>~x>ԏ>=>>ܿx>K>,>7v>>>>7v>,>K>ܿx>=>>ԏ>~x>ѧ>T>>E>~>>\\>09>d=<㥼#U߽o*W"SɯwTw뾔)x `Yg@l i-QACS=1#=5=>5>7>H3>O%>N>E2>30> =Y =٠}> =>'><.>J >>P->M>C<>0%E>8=}=D<ԼOWXơ1[H6l ^b `u{"Z!3& !0;=O=ı{>>8"4>^[>}>>q>Y>>8>X>J>n>~{>З>>7>>З>~{>n>J>X>8>>Y>q>>}>^[>8"4>=ı{=O;0 !3&Z!{"u `b^ lH61[ơXOW<=D=}>8>0%E>C<>M>P->J >><.>'> ==٠}==0>>05>BQ>MCE>P\>K@>=>(> x=ѳ=<¼U{۾$Lup!ľ;]^^YKvP21EcAB@c!0yƁ[<=vb=:#> 3>09>Q>on>>>>σ>>>>`>W>>W>`>>>>σ>>>>on>Q>09> 3=:#=vb<Ɓ[y0!@ccABE1P2KvY^]^;p!ľLu$۽U{<==ѳ> x>(>=>K@>P\>MCE>BQ>05>=0=="i=C >x>!>7>F>O2>O>H>8K>!B>=(=]b<8T( Rn:н(9OY{q*; 8(BynBOH-1–g l>6>N>cS>v0>>>GO>>>1>>>GO>>>v0>cS>N>6>==U=eD>!B>8K>H>O>O2>F>7>!>x=C ="i=>=?=)e>>)>=\>J]>P'0>NRx>D>3>d===A;:Y!)ʭOY{p!ľ4徚䂾+(̾r2{ta޾C"+lRƂ<=!=Z==v> 3>0>/z>F\>Mr>Q>S>Q>Mr>F\>/z>0> 3=v==Z=!<ƂlR+"Ca޾{t2r(̾+䂾4徐󾅥p!ľOY{)ʭ佩Y!;:=A==>d>3>D>NRx>P'0>J]>=\>)>=)e=?=>H>0o4>AI>L>Pk}>L>A>/P>UH=H=9=/+:#ν)/(9Lulibƾ6 s<Ҿ,Ⱦ־ھsgZ!>!б0r <<=O=(=+A=ı{=؟==v=Q=v==؟=ı{=+A=(=O<< 0rб!>Z!sgھ־,ȾҾs<6 ƾiblLu(9佬)/:#=/+=9=H>UH>/P>A>L>Pk}>L>AI>0o4>H=Ϯ==qF*!> `'>5z>E2>N5r>PBi>K%(>>>+>f=q==%09)/Y!$H6g+㐾ֶJ|H y2qf>ZC*W"zy–X'L nu_<02y HJ|ֶ㐾+gH6$Y!)/9=%0==q>f>+>>>K%(>PBi>N5r>E2>5z> `'>*!=F==Qq;ji&=J=ᐹ> o>&J>9=>G>O%>O>I>)>E={=)=%0:#ν:н۾1[@l_Yz}^X㳾a vBKuZrv cABO8;(kбLνyzlRg llRzyνLб(k;O8cABv rZKuvBa 㳾X^z}_Y@l1[۽:н:#=%0=)={>E>)>I>O>O%>G>9=>&J> o=ᐹ=J=@<>P >*3><ϧ>I[V>Or>O>H?>;t>(G>~y={==/+;: Rnơ i7Uëps+ݾ^䂾j2y~5N{r\cABTFx9=c-1"! T . ! . T !"-19=cFxTcABr\N{5~y2j䂾^ݾ+psUë7 iơ Rn;:=/+=={>~y>(G>;t>H?>O>Or>I[V><ϧ>*3>P ===d>->>u>Jx>O>O7&>H3>; >(G>E=q=9=A<8T(U{X- )*n(H0c<{4dV龏䋾̆kqj[,ɾ2 1⾂Ծ{"*qf>h[O`DOYY־SɯOHM;ӾLfgM;ӾOHSɯYY־`DOh[Oqf>{"*Ծ⾌12 ,ɾ[jqk̆䋾V{4dcE>(G>; >H3>O7&>O>Jx>>u>->=rV===s/żo!xݽRVa;=I=S=ˑ>!>:c>04>@Y>K>P>O[>H3>;t>)>f=H==]b<¼OWQA;8jTkf>)>;t>H3>O[>P>K>@Y>04>:c>!=ˑ=S=I;ƼRVaݽ։>9/˼P=c>k#>1>A>KL >P>O7&>H?>+>UH==(=<ԻCSŽ , %j@lY5nx*fibH㳾YھϨk供V~AҾsZuc쾒ncnc쾔uZsҾAV~k侚ϨYھ㳾Hib*fxnY5@l%j o, CS<==(=>UH>+>H?>O7&>P>KL >A>1>k#>=c=Ӡ=c=3։$x$(BGY<)=DoY==X>>N>2>A>K>O>O>I>>>/P>d>=ѳ=D=1#>d>/P>>>I>O>O>K>A>2>N>=X==DoY<)BGY$(x$ٽpy }"Jc<<3=Oq=1=۞C>>N>1>@Y>Jx>Or>O>K%(>A>3>!B> x=}=5=mp}ݾRGc}ݾ(Hq v}. x>!B>3>A>K%(>O>Or>Jx>@Y>1>N>=۞C=1=Oq<<3½c}"Jy pپ Kj 5p7K|<=U?U=?=۞C>>k#>04>>u>I[V>O%>PBi>L>D>8K>(>8==(==AN<¼ Dڽ~Ž-) | #3EUëc8>(>8K>D>L>PBi>O%>I[V>>u>04>k#>=۞C=?=U?U<ϻ|Kp7 5jK <<0[gz׼Ż=c>:c>-><ϧ>G>N5r>Pk}>NRx>H>=>0%E>5> =3=ϫ==,Ͻ< X RnlȽIݽϽо"߾2Ǿ@`M"X:b2gjWɾq*ve{4d~x{+fѾ+x{~{4dveq*jWɾb2gX:M"@`2Ǿ"߾нϽIݽlȽ Rn X<=,Ͻ==ϫ=3> >5>0%E>=>H>NRx>Pk}>N5r>G><ϧ>->:c>=c=X=1=U?U!>>*3>9=>E2>L>P'0>O>K@>C<>7>)>>a====/+o\ԢDJ |Sb$/8x@lGþLQT UëVW_UëT QLGþ@l8x/$Sb |JԢD\>o CSa>>)>7>C<>K@>O>P'0>L>E2>9=>*3>>!=Ӡ==Oq<ϻڽcҽ\3H 2! ir(߽-cŻ|<<3=DoY=c=ˑ=rV>P >&J>5z>AI>J]>O2>P\>M>H3>?Q{>3>%w >8>F=='=Lh=HoXKҽ )"q \];1[ # j #1[;\]q )"KҽX>oμ,V$<"UF>8>%w >3>?Q{>H3>M>P\>O2>J]>AI>5z>&J>P =rV=ˑ=c=DoY<<3|Žc-߽(r i   D5t 刃߽ҽgz׽K<)=3=S==> o> `'>0o4>=\>F>MCE>P->O%>L^%>F>=>1ƒ>$q>z>a=q=v==x=1#a>z>$q>1ƒ>=>F>L^%>O%>P->MCE>F>=\>0o4> `'> o===S=3<)½Kgz׽ҽ߽刃 5t D Ծ< 7 .d (\3[p7cBGY*!>H>)>7>BQ>J >>N>Ph>OD>KwZ>E=>2>&U>> ==S==)= =H= >>&U>2>E=>KwZ>OD>Ph>N>J >>BQ>7>)>H>*!=ᐹ===I BJ .d5tr0 5}"J$(P;=s=d=J=F=Ϯ>>!>05><.>E2>Kw>OK>Pj>O[>K.>F>>U>5>+> >8)> ===n==Y==fڱ=DE7=%k= s >8)> >+>5>>U>F>K.>O[>Pj>OK>Kw>E2><.>05>!>=Ϯ=F=J=d=s;ƼP$(}"J 50r5t .d BJz>K7켽Ѿ-^z> 7 DH <jy 9/˼/===)e>x>>'>30>>p>Fu8>Lo>OW>Pk>Ou3>L>H3>BYo>;R>3\>*[>!B>*>>a==q=׀=R=ϫ====E=D==D=E====ϫ=R=׀=q=>a>>*>!B>*[>3\>;R>BYo>H3>L>Ou3>Pk>OW>Lo>Fu8>>p>30>'>>x=)e===@<>-^ѽ켽ЅѽK<  i2!<Kpx>RVa  => >)>5zj>>~>FRJ>Kw>N>PR>P>NRu>K@>G>A><3M>5>/P>(>!">d>8>~y> R>>===K= =K==>>> R>~y>8>d>!">(>/P>5><3M>A>G>K@>NRu>P>PR>N>Kw>FRJ>>~>5zj>)> > ==0=C =?=qF=QqxpK<2! i ="i==٠}=Y >>k#>*>49>=v>Dä>J >>MT>O?>Pk3>O>NRu>K>H?>E>A>8K>4e>0k>,>)>&M>$q>" >!">!B>!">" >$q>&M>)>,>0k>4e>8K>A>E>H?>K>NRu>O>Pk3>O?>MT>J >>Dä>=v>49>*>k#>=Y =٠}=="i=>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@P@@P@P@Q@Q@@Q@Q@R@R@@R@R@S@S@@S@S@T@T@@T@T@U@U@@U@U@V@V@@V@V@W@W@@W@W@X@X@@X@X@Y@Y@@Y@Y@Z@Z@@Z@Z@[@[@@[@[@\@\@@\@\@]@]@@]@]@^@^@@^@^@_@_@@_@_@`@` @`@@``@`@`@`@`@a@a @a@@a`@a@a@a@a@b@b @b@@b`@b@b@b@b@c@c @c@@c`@c@c@c@c@d@d @d@@d`@d@d@d@d@e@e @e@@e`@e@e@e@e@f@f @f@@f`@f@f@f@f@g@g @g@@g`@g@g@g@g@h@h @h@@h`@h@h@h@h@i@i @i@@i`@i@i@i@i@j@j @j@@j`@j@j@j@j@k@k @k@@k`@k@k@k@k@l@l @l@@l`@l@l@l@l@m@m @m@@m`@m@m@m@m@n@n @n@@n`@n@n@n@n@o@o @o@@o`@o@o@o@o@p@p@p @p0@p@@pP@p`@pp@p@p@p@p@p@p@p@p@q@q@q @q0@q@@qP@q`@qp@q@q@q@q@q@q@q@q@r@r@r @r0@r@@rP@r`@rp@r@r@r@r@r@r@r@r@s@s@s @s0@s@@sP@s`@sp@s@s@s@s@s@s@s@s@t@t@t @t0@t@@tP@t`@tp@t@t@t@t@t@t@t@t@u@u@u @u0@u@@uP@u`@up@u@u@u@u@u@u@u@u@v@v@v @v0@v@@vP@v`@vp@v@v@v@v@v@v@v@v@w@w@w @w0@w@@wP@w`@wp@w@w@w@w@w@w@w@w@x@x@x @x0@x@@xP@x`@xp@x@x@x@x@x@x@x@x@y@y@y @y0@y@@yP@y`@yp@y@y@y@y@y@y@y@y@z@z@z @z0@z@@zP@z`@zp@z@z@z@z@z@z@z@z@{@{@{ @{0@{@@{P@{`@{p@{@{@{@{@{@{@{@{@|@|@| @|0@|@@|P@|`@|p@|@|@|@|@|@|@|@|@}@}@} @}0@}@@}P@}`@}p@}@}@}@}@}@}@}@}@~@~@~ @~0@~@@~P@~`@~p@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@@@@@@@@?@GGGGGGGG@@GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGgdalautotest-3.2.2/gdrivers/data/netcdf/byte_no_cf.nc0000664000175000017500000000261414020414072021323 0ustar evenevenCDF xy  mygridmapping  spatial_refqPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]] GeoTransform440720 60 0 3751320 0 -60 Band1  long_nameGDAL Band Number 1 _Unsignedtrue valid_range _FillValue grid_mapping mygridmappingskkkkksck΄k{{k{k{{cs{Jsc{csZcsZcckcck{kkkscscckssZ{skZkskZc{sss{{sck{ccsccs{c{c{{k{ckksskck{{{k{{ssZkkkkkc{s{c{kcs{{k{{{kccs{kksks{{k{{ss{s{{csc{ssk{s{{kssksc{cckŭc{sc{{ss{ksc{sksss{{{kk{{{s{s{s{ksksss{sks{kssksksk{ssk{{c{ck{skkk{sgdalautotest-3.2.2/gdrivers/data/netcdf/test_ogr_nc4.nc0000664000175000017500000026343014020414072021613 0ustar evenevenHDF  g0OHDR-бVбVбVбVs"!Z I ' ConventionsCF-1.6 <GDAL"GDAL 2.1.0dev, released 2015/99/99 Rhistory5Tue Feb 09 20:48:39 2016: GDAL Create( test.nc, ... ) (ogr_layer_nametest & featureTypepointOHDR-бVбVбVбV!   +CLASSDIMENSION_SCALE$h&WJ&9OCHKrOCHK ZNAME@This is a netCDF dimension but not a netCDF variable. 0UOHDR-бVбVбVбV!    +CLASSDIMENSION_SCALEhNz'8vOCHK LDIMENSION_LISTOCHK ZNAME@This is a netCDF dimension but not a netCDF variable. 3^OHDR-бVбVбVбV ?@4 4+GLs :standard_nameprojection_x_coordinateG unitsm؟&FHIBp]p[pY`OCHK 9 long_namex coordinate of projectioneOHDR-бVбVбVбV ?@4 4+GMs :standard_nameprojection_y_coordinatefG unitsmFSSEMOCHK 9 long_namey coordinate of projection]ehOHDR-бVбVбVбV ?@4 4+GLs + long_name z coordinate )standard_nameheight KOCHK (ogr_field_typeRealOCHK axisZ unitsm=OHDR-бVбVбVбV* Rx5FSSEu>$WOHDR-бVбVбVбV;   +M * long_name Field int32 )ogr_field_nameint32; t LDIMENSION_LIST1OCHK +ogr_field_typeInteger 5 grid_mappingtransverse_mercator}FRHPK  (MLPBTHDd( }eBTHD  d( {aFSHDwPx( %%ǣ +BTLF-L L KX Z20GD\JHViI`A[6Wמ`U 8u ]:úPWX56#BTLF :PWGH6WZ-UiIL u gOCHK & coordinatesx y z;NOHDR-бVбVбVбV   +{0 8 _FillValue { LDIMENSION_LISTOHDR-бVбVбVбV ?@4 4+G , long_name Field float64 +ogr_field_namefloat64 6FRHPN!  6 _FillValueSUZ3/OHDR-бVбVбVбV   +XF LDIMENSION_LIST1ÉOHDR-бVбVбVбV   +(kN 8 _FillValue (kUZ/pZOHDR-бVбVбVбV @+V LDIMENSION_LIST -OHDR-бVбVбVбV @+^ < _FillValue@VZ'OCHKpg LDIMENSION_LIST 8OCHKw LDIMENSION_LISTZ %OCHKo LDIMENSION_LIST6.OCHK LDIMENSION_LIST 8ÍFHIB pcp_#mT<OCHK` LDIMENSION_LIST+)OCHK l0REFERENCE_LIST6datasetdimension .(OCHK LDIMENSION_LIST)OCHK \DIMENSION_LIST  K+OCHKX LDIMENSION_LIST+c(OCHK LDIMENSION_LISTOCHK( LDIMENSION_LIST tOCHK LDIMENSION_LIST(OCHK LDIMENSION_LISTx[OCHK LDIMENSION_LIST7OOCHK LDIMENSION_LIST;m(OCHK LDIMENSION_LISTOCHK LDIMENSION_LISTOCHK8 LDIMENSION_LISTOOCHKx LDIMENSION_LISTZOCHK LDIMENSION_LIST4JOCHK LDIMENSION_LIST0OCHK LDIMENSION_LISTѬOCHK LDIMENSION_LIST!,6POCHKh LDIMENSION_LISTOCHK <0REFERENCE_LIST6datasetdimension j =,.y0G2!4G5679:<=-?I@A4CPDlEFGHIJ6FHDBp uint_fieldGuint_field_explicit_fillValueH uint64_fieldI uint64_field_explicit_fillValueJFHDBي(int64varG5int64var_explicit_fillValue6boolean7boolean_explicit_fillValue9float32:float32_explicit_fillValue<int16=int16_explicit_fillValue-? byte_fieldA ubyte_field4Cubyte_field_explicit_fillValuePD ushort_fieldlEushort_field_explicit_fillValueFFHDBrecordtwodimstringchar_max_widthxjyztransverse_mercatorP int32 int32_explicit_fillValue=float64 float64_explicit_fillValue string3chars, twodimstringchar. datey0 datetimeG2datetime_explicit_fillValue!4x1I@FHDB Jj spatial_refTPROJCS["WGS 84 / UTM zone 31N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32631"]]FHDB 'grid_mapping_nametransverse_mercatorlongitude_of_central_meridian ?@4 4@false_easting ?@4 4Afalse_northing ?@4 4latitude_of_projection_origin ?@4 4!scale_factor_at_central_meridian ?@4 4x#? long_nameCRS definitionlongitude_of_prime_meridian ?@4 4semi_major_axis ?@4 4@TXAinverse_flattening ?@4 4mtr@TREE TREE!)TREE19A??G@@G@GG{{+B?GG+B?^@^@#%'STR@GG~2zAGG~2zA^@^@qqqq{{?||?BB{ {{@GG(k(k(kqTREEIMQTREEUY]TREEaiqTREEyTREETREEĀǀTREEʀҀڀTREETREE TREE"TREE*2:TREEBCDTREEEFGTREEHLPTREETX\TREE`bdTREEfhjTREElt|TREETREETREETREETREETREETREETREETREEɁсفgdalautotest-3.2.2/gdrivers/data/netcdf/cf-bug636.nc0000664000175000017500000010416414020414072020621 0ustar evenevenCDF  longitudelatitude@ CDIGClimate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi) ConventionsCF-1.4history?Wed Sep 07 20:38:38 2011: cdo -f nc copy bug636.nc bug636-cf.nc file_nameecham3_0fix_tas_va_map model_nameecham3.6T42L19 experiment,Present-Day Simulation with Prescribed SST'sCDOHClimate Data Operators version 1.5.2 (http://code.zmaw.de/projects/cdo)  longitude  standard_namegrid_longitude long_name LONGITUDEunitsdegreesaxisXtlatitude  standard_name grid_latitude long_nameLATITUDEunitsdegreesaxisYttas unitsC _FillValue`x stat_name%Interannual Variance of Annual Means valid_minqƧ valid_maxp/wmean_valq $/ mean_absval@q $/ warning_flag missing_counttitleSurface Air TemperaturesourceYPMIP Present-Day 10-Year Simulation with Prescribed SST's from the echam3.6T42L19 modelnotes2-meter screen temperaturet@3@A A4A`AAAA~AABB?}BB(B4B??}BJBUBaBl?}BwB`BBBB@BBBBBB`BBBB@BBBʀBBB`BBB柾B@BBBBC`C0!CC C Cp!C@CCC!CC OC# C%!C(C+C.`C10!C4C6C9C5È>VÈwÈ<)È<È>È?\È<È7 È.VÈ#3ÈLÈ ÇjÇÇÇÇÇ ÇÇÇ}ÇÇÇÇyÇÇÇÇÇÇ7È È ÈÈÈ\È"È%È&È(sÈ)È+È-È.È0BÈ0È2È33È7È<È@ÈBoÈD{ÈBÈ=È7 È/È(sÈ!'ÈsÈ'È ÈÈÇÇ#ÇÇÇÇ\È'ÈÈÈRÈ È Ç`ÇÇÈÈÈÈ`ÈÈ /ÇjÈfÇNÇÇÇÇ}Ç7ÇÇ/Ç}ÇÇÇÇÈÇFÇÇÇÇÇÇÇÇϞÇÇhÇÈÈhÇÈÈÈ$È.wÈQhÈVÈXsÈXÈVfÈRÈNÈJÈHsÈHÈIÈMqÈQhÈRÈOÈF%È6È$È Ç\Ç ÇÇ ÇÇÇ%ÇÇÇwÇ-ÇTÇZÇÇÇÇ}ÇÇÇÇ}ÈÈ ÈhÈ?ÈÈÈÈ È È`ÈÈsÈÈ!È0È1È3È6È:È=È=È:È6È0BÈ(È ÈÈÈÇjÇ9ÇÇÇ`ÇÇRÇPÇHÇÇFÇÇÈÈÈwÈÈ1Ç-ÇmÇÈÈ È/ÈRÈÈ ÈÇRÇÇPÇÇ1ÇÇRÇÇÈ9ÈÈ jÇ{ÇÇZÇÇÇÇÇÇÇÇLÈ+È =ÈÈÈ !È/\È@ÈIÈbÈcÈa'È[DÈS3ÈIÈ)XÈ#È7ÈÈÈ ÈÈÈ6È*ÈfÈoÇÇ!ÇÇÇÇ{ÇÇ5ÇÇٺÇÇ^Ç}ÇÇÇÈHÈÈ ÈÈÈdÈ$È)È.5È0È+È*È*È%`ÈÈÈÈ ÈÈ 7È ÈÈdÈ'mÈ/È0È,È+È!ÈÈ'È)ÈÈÇVÇÇjÇÇÇÇLÇdÇÇÇÇwÇÇRÇÇoÇ^ÇÇJÇÇRÇ}ÇÇ7ÈÇÈbÇÇÇJÇÇÇ/ÇfÇ;ÇÇޘÇÈbÈ ÈÈ1ÇÇÇDÇÇ9ÇŢÇ+ÈÇ\ÈTÈÈ*È<ÈDÈMÈU`È[È`bÈkdÈhÈ`ÈV%ÈJÈ7È-qÈ}È%È ÈÈÈNÈÇJÇÇÇۦÇθÇŢÇÇ?ÇFÇȴÇ͑ÇfÇߞÇÇÈ!È ÈÈÈÈÈ?ÈÈÈÈ(È0È;È:È49È0È5?È.È$ÈÈ PÈÈÈ ÈÈÈÈ.wÈ4È:È5È%`ÈÈ =È È dÈ!hÈ\È ÈuÇÇӖÇ\ÇNÇ!ÇBÇÇXÇÇÇÇÇHÇ%ÇÇɺÇϞÇÇÇևÇ+Ç׍Ç1ÇyÇÇÇ;Ç!ÇÇÇÇÇÇ^ÇщÇ5ÇÈ9ÈÈÈÇÇmÇÇqÇÈ"NÈ.È7+ÈMÈRNÈR-ÈF%ÈLÈ^Èd9ÈhÈk#ÈlÈkdÈcÈVÈCuÈ4È0bÈ,È?\È$ÈRÈÇÇÇÇÇÇÇÇÇ^ÇÇÇÇ/ÇÇLÇÈÈ ÈÈÈ!È#È bÈ ÈÈÈ1ÈyÈ"È0È2È.wÈ&%È%È!È(È'LÈÈÈÈ PÈ È È /ÈÈÈ È&È,JÈ0È)È*È)È6È.È$9ÈÈ-ÇÇɚÇÇ7Ç°ÇÇÇÇÇÇÇ̬Ç'ÇբÇ)ÇÇÇ1Ç׍Ç ÇuÇÇÇÇjÇTÇÈ È ÈVÈ}È#ÈoÈÇÇ;ÈÈuÈ%?È9XÈ>È>wÈ4È6FÈFÈW ÈaÈeÈdÈdÈe`ÈfÈiÈkÈmPÈmPÈmqÈmÈmÈg+ÈaÈHsÈ>5È1È/È.VÈNwÈB-È!HÈ ÈÇÇ=ÇÇfÇÇÇÇÇÇÇÇÈÈ È È /È'ÈoÈÈdÈ"-È%È(RÈ&fÈ$ZÈ&È(1È*È.È.wÈ)È&È!È bÈ"È)XÈ)È(1ÈVÈÈÈJÈ È${È)È/}È8ÈEÈO;ÈWLÈZÈWÈNÈ8RÈ'LÈÈ5ÈÈÇÇJÇÈPÈ2ÈAÈEÈ:=È1È'È7È ÇqÇÇRÇÇѪÇ\ÇÇXÇ{Ç^ÇsÇjÈÈ ÈÈ)È0BÈ/;ÈÈ ÇÈ DÈÈÈ7+ÈJÈTÈYÈ]ÈcÈj^ÈpBÈqhÈoÈmqÈlÈmÈqhÈuÈwLÈtÈoÈj^ÈgÈgÈdÈhsÈe`È]ÈU`È@!ÈRNÈL)È*ÈÈ3È È ÈmÈÇÇÇhÇÇyÇÇÇÇÇÇÇÈÈLÈ ÈLÈ#TÈ'È0È;È<È4È.È*È(È%È&fÈ' È-È&ÈÈ+È'È8RÈ:ÈIÈO\ÈQÈRoÈPÈNÈHÈMÈVÈ_ÈgÈlÈmPÈjÈcÈZÈQÈJÈEÈ@È@BÈ?ÈAÈHÈRÈ]ÈfÈljÈlÈffÈYÈBoÈ0BÈ!È-È ÇPÇÇÇJÇZÇÇ+ÇÇÇÈ^ÈjÈÈ"È' ÈÈ ÈbÈ È È"NÈ.VÈJÈWÈ_ÈdÈi7ÈlÈmÈnÈnÈnwÈoÈqÈtÈw ÈwÈtÈiÈ^ÈFÈD{ÈcÈh1Èd{È?}È4ÈLJÈ*È)XÈ&ÈdÈ9ÈoÈ5ÈFÇ=ÇÇÇÇÇ=ÇDÇÇÇÇÇÇÇÇÈ È"È3TÈÈ8È.È.5È7+È2È,È)È/È4{È5È-È"ÈÈÈ%ÈAÈLÈS3ÈTÈRNÈZ=È\jÈYyÈUÈcÈlÈsÈw Èw ÈvFÈtÈqÈnÈk#ÈgÈdÈbÈcÈdÈfÈiXÈlÈpÈt{ÈvÈuÈoÈb-ÈPBÈ>È2È)È)yÈ}ÇÇNÇÇ7ÇÇÇÇÈ ÈÈbÈÈ#È$È bÈÈÈÈÈ"È6%ÈSÈ`!ÈgmÈkDÈlÈmÈo;Èp!ÈpÈqÈqhÈrNÈsÈtZÈpÈfÈJÈUÈ<)È2ÈUÈ*È(È&ÈÈ&FÈ,È.È/\ÈqÈÈÈ9Ç?ÇÇÇVÇÇÇ9ÈÈÇÇ}ÇÇÇÇÈÈ0È@ÈJÈGÈHÈ@ÈCÈ49È>5ÈCTÈ4È-È)7È1È2oÈ,È!hÈÈFÈ/\ÈAÈJÈNÈMÈ]ÈeÈhÈhsÈi7ÈmÈsÈvÈvÈuÈu`ÈwmÈxÈw ÈsÈpÈpBÈpÈpbÈpBÈpbÈqÈt{ÈwÈy7ÈwmÈtÈo;ÈeÈXsÈPÈ>È1hÈ%?ÈÈÇ ÇÇ7ÈÈÈÈTÈ7ÈÈ!È#È%È&%È)È/}È6È5È5ÈAÈTÈfÈl)ÈmPÈn5ÈpBÈrNÈr ÈqÈq'ÈrÈrÈr ÈrÈrÈnÈgÈ`bÈ<È BÈfÈÈ/È>ÈBÈ=PÈAÈDÈ8È*=È BÈsÈ ÇÇ;ÇbÇÇÇRÇÇqÇÇ)ÇÇÈÈÈsÈLÈ+#ÈD{ÈJ^ÈAÈ@ÈDÈEÈKÈG È>VÈ6È+È+È#TÈ-È5È3È&%ÈÈ)ÈM/ÈO}ÈTÈ[Èe`ÈmPÈoÈnÈnwÈpÈsÈuÈvÈuÈvÈxÈzÈz^ÈyÈx1ÈvÈtÈsÈsÈsÈuÈw+ÈwÈwÈwLÈu`ÈsuÈsÈiÈL)È>wÈ;È81È1È%ÈÈÈHÈBÈ ^ÈÈ.ÈAÈ8È4{È.È+DÈ)È0BÈ;ÈMÈ[È^ÈW+ÈdÈpÈsuÈpÈlÈlÈn5Èo;ÈpÈrÈvÈw+ÈtÈt{ÈuÈsÈqÈl)È_;È1È)È2ÈAhÈHÈGmÈ>È81È8È8sÈ;ÈPÈ@!ÈBÈÈÈsÈ'È<ÈÇ5ÇÇÇ+ÈÈÈÈÈ/È#ÈwÈ*È=/ÈFFÈXÈOÈ\ÈWÈGÈ1È!'È$È"ÈÈ$ÈÈ%È)È!'ÈLÈZ=È]Èa'ÈhÈpÈsÈsÈt9ÈvfÈxÈxÈxRÈxÈy7ÈyÈyÈxÈvÈvÈw+ÈvÈuÈsÈroÈsÈuÈuÈvÈw ÈvÈt{Èr-Èu`ÈnÈHÈ9È=ÈNÈNÈ5`È+È BÈÈÈÈÈ%È.È.VÈ1È3È6fÈ0bÈ2È>ÈQ'È`ÈiÈmÈqÈvÈv%ÈpÈiÈhÈljÈnÈqÈtÈwÈxsÈw ÈtÈsÈr ÈqÈn5Èa'ÈKdÈPÈ`Èc3È^wÈ^ÈB È/;È%È#È&%ÈKÈQÈJ=È9XÈÈ1HÈVÈSuÈ3TÈÈÈÈÈ{È dÈ(È33È3È.È1È;DÈL)ÈTÈXÈ_}Èb ÈYXÈOÈJ=È7ÈLÈ XÈÈ jÈÈÈÈMÈZÈc3ÈTÈiyÈl)ÈpBÈqÈqÈr ÈsÈu?ÈvFÈvÈvÈwmÈxÈwÈvÈtÈs3ÈqÈqhÈqÈqÈqÈsÈu?ÈuÈwmÈxÈwÈsTÈn5Èq'ÈmÈ@BÈ-È5ÈCÈ@È4{È+DÈ-/È*È!'ÈXÈÈ+ÈSÈ#È+È/È97È9È<ÈQÈ\ÈeÈiÈkÈmÈpBÈm/Èe?ÈdÈiÈoÈrÈtZÈu?ÈvfÈwÈw ÈtÈrÈpÈlJÈSTÈQhÈOÈbÈkÈtZÈtÈo;ÈbÈSÈ2-È9ÈHÈÈ'È =È ÈfÈ,)ÈNÈUÈ=È$È9ÈÈÈÈ DÈÈÈ0È4È9ÈÈ[DÈ`ÈdÈfÈeÈdZÈdZÈe`Èf%ÈeÈd9ÈhÈpbÈu?ÈvÈuÈuÈuÈwÈxsÈuÈt9ÈmÈJÈK#ÈPÈeÈ]ÈaÈkÈp!ÈpÈoÈfÈCuÈQ'È"NÈ;ÈÈ #ÈsÈÈ*=ÈLÈ[dÈW+È@È-ÈÈ ÈÈ È"oÈ+È+È,)È1hÈ0È#uÈÈ"È3È>ÈHÈGÈEÈ/ÈÈ!ÈXÈ\ÈJ=È`ÈiXÈiÈdÈ\JÈjÈo;ÈnÈlÈlÈlÈlÈlÈp!ÈroÈrÈrÈr ÈpÈpÈqhÈqHÈo\ÈnVÈo;ÈroÈuÈvÈxRÈwÈwmÈvÈsÈtÈvfÈu?Èw+ÈyÈlÈ<)È.5È*È)È0BÈBÈ?\È!ÈÈmÈBÈÈ=ÈPÈ'È/È^5ÈeÈf%ÈhsÈiÈiÈiÈhÈiÈkÈlJÈm/ÈpÈtÈuÈtÈuÈvÈxRÈxÈxÈv%ÈuÈoÈdÈBÈWÈ<)È+È-qÈ8È^ÈgÈmPÈmÈkÈgÈaÈWLÈFÈ+È'È7ÈKDÈSÈ\jÈVÈHÈ<È.È)XÈ'È<)È6È&ÈÈ${È È È$ÈÈ È#3È5ÈMPÈi7ÈkÈbÈkÈqÈrÈcTÈ;DÈ,È4ÈFÈUÈY7ÈPbÈFfÈ@bÈ;È;È;È=/È:È/È3ÈÈ.È=È+È@È+È-ÈBÈIXÈ/;È(È\ÈÈ-È3uÈlÈpÈl)ÈljÈn5Èm/ÈoÈsÈsÈqÈpÈsTÈt9ÈtÈuÈwÈvÈtÈsTÈrÈtÈvfÈwÈvÈtÈsÈsÈsÈuÈvÈvÈyÈz=ÈxRÈtÈtÈwÈz^ÈyÈxsÈxRÈqhÈaÈ%ÈXÈ.ÈF%ÈC3È,È1ÇÇÈÈdÈ"ÈÈJÈbNÈl)ÈoÈqÈu?ÈwÈxsÈwÈwLÈw ÈvÈvÈvÈvÈwÈyXÈxRÈw+Èw ÈvfÈxÈvFÈvÈuÈ\ÈLÈ@È,È1'È4È6ÈAÈMÈR ÈVÈ[ÈcuÈfÈbÈNÈ6È-È:ÈLÈYÈ[ÈJ=È=qÈ6È4È4ZÈVÈHRÈKdÈSuÈkÈbÈGÈ>5È?\ÈH1ÈE?È<È.5ÈÈÈ*=È<ÈU`ÈLÈ=È:ÈB-ÈKdÈF%È`Ç)È?È!hÈDÈjÈt9ÈtÈrÈwÈxÈvÈuÈsÈrÈqÈqHÈr ÈsÈvÈw+ÈvÈxRÈyXÈxÈxÈxsÈwÈxÈyÈwLÈuÈu`ÈvFÈwÈyÈ|È{ÈzÈyÈxÈyÈzÈyÈwÈwÈ{#ÈzÈvFÈnÈfFÈ[#ÈCuÈ/ÇÇ5ÈYÈp!ÈgÈaÈ_;ÈPÈkÈs3ÈsÈsÈuÈvÈy7ÈwÈu`ÈwLÈxÈxsÈxRÈyÈzÈyÈzÈzÈ{dÈ|ÈzÈy7ÈuÈpÈLjÈ9È7È?}ÈR ÈKÈ2-È,jÈ7ÈEÈGÈ@!È;dÈ?ÈIÈFÈ>ÈQÈJ=ÈK#ÈHÈLÈOÈSÈW ÈaÈgLÈjÈgLÈRÈ&È3È-ÈKdÈR-È\jÈHÈ/}È3ÈBÈAÈ@ÈÈÈ'ÈFÈpÈx1ÈuÈtZÈt{ÈwÈxÈvÈvÈvÈuÈtÈrÈsÈu?Èx1ÈyyÈy7ÈzÈ{ÈyÈyÈyÈxÈxÈyyÈxÈw+ÈwÈxsÈyXÈz=È{È{#ÈzÈyÈyÈyXÈz^ÈyÈw+ÈxRÈyÈxÈvÈxÈqÈfÈZÈ5ÈuÈ)ÈkÈo;ÈpÈlÈo}Èo;ÈpÈqÈrÈsuÈuÈwÈyÈyyÈvÈxÈzÈyÈyyÈxÈw ÈxÈyÈyyÈxÈzÈ{ÈwÈtÈYÈ@È5È6ÈEÈN5ÈH1È;È+#È(È<ÈD9ÈDÈ>È>wÈ<È=È@ÈLjÈ\ÈIXÈ@BÈCÈKdÈTZÈ`bÈrÈuÈwÈpÈqhÈCuÈ7ÈHÈU?È]ÈsÈljÈRÈKdÈ9È9È?;È8È`ÈlÈtÈyÈuÈsÈsTÈuÈvFÈuÈvÈwÈxsÈwÈuÈtÈu?ÈuÈvÈxsÈz=È{È|)ÈzÈ{DÈ{Èz=ÈyXÈyÈyÈyXÈyÈ{È{DÈzÈzÈzÈyÈyÈyÈxÈy7ÈyÈxÈxRÈwmÈu?ÈrÈsÈvÈo;ÈcÈ7È*^È6ÈbÈuÈt{ÈsÈw ÈvÈsÈuÈuÈu`ÈvÈxRÈyÈyÈyÈy7ÈzÈ{È{ÈzÈxÈyXÈz=ÈzÈzÈ{#È|Èw+ÈtÈIXÈ.È,È8RÈDÈFfÈMPÈIÈ97È)È5?È@ÈNÈNÈCTÈÈ.5È49ÈKÈ?ÈC3È^ÈpÈwÈvFÈtÈv%ÈtZÈtÈhÈ@bÈ%?ÈXÈjÈqÈo;ÈpBÈ`È3È8È@ÈGÈmqÈqÈrÈsÈcÈwÈvfÈuÈvFÈwLÈyÈyXÈxÈy7Èz^ÈxÈwmÈyXÈzÈyÈyXÈzÈzÈyÈzÈz^ÈyXÈxÈyÈ{È{È{È{È{#ÈzÈ{DÈ|Èz^ÈyÈyÈxÈuÈu`ÈuÈtÈsÈqÈo\ÈoÈsÈt9ÈpÈu`ÈtÈpÈc3ÈF%È@ÈZÈ[dÈsÈyÈyXÈxÈvFÈuÈwÈz=ÈzÈ{DÈ{È|ÈxÈzÈ|È{DÈyÈyyÈzÈ{DÈ{Èz^ÈrÈkDÈFÈ3È+È"È/\ÈJÈ<È@ÈMÈ;È=ÈE`ÈG+ÈHsÈGÈG+ÈCÈ9È+È0BÈ:ÈPÈcÈsÈsTÈu`Èv%ÈuÈwmÈtÈu`ÈrÈAÈ(RÈ`Ès3Èu?ÈtÈo;ÈtÈj^È_;ÈKdÈHÈsÈqÈt9Èt{ÈsÈsÈpÈrÈvÈyÈyÈyÈyÈ{DÈ{Èz=ÈyÈyyÈxÈyÈzÈz=ÈyÈyÈzÈyyÈxÈxÈxÈzÈzÈ{DÈzÈzÈ{#È{#È{ÈzÈyÈyÈyÈx1Èx1ÈwÈwÈxRÈxÈw ÈvÈx1Èz=ÈuÈu`Èw ÈvÈw ÈlÈhÈmÈfÈwÈwÈxRÈvÈuÈqÈrÈuÈzÈyÈzÈ|)È{È{dÈ|È|È{dÈzÈ{È}qÈ|)Èz^ÈuÈsÈ_ÈEÈ@È81ÈCÈMPÈLÈJÈLJÈ?È>ÈJ^ÈTÈUÈXsÈM/È<ÈRÈNÈ7+È49È;DÈPÈf%ÈwLÈyXÈwÈvÈyÈwÈuÈz=ÈfÈDÈlÈwLÈw+ÈuÈvFÈvÈr ÈqhÈqÈt{ÈxÈuÈwÈvÈsÈsÈs3ÈtÈwÈxÈxÈyÈzÈz^ÈxÈyÈ|È{ÈxÈzÈ|JÈ{ÈzÈ{dÈz^ÈyÈyXÈyÈyÈyÈz^È{ÈzÈ{DÈ{DÈyÈyÈz^ÈyÈyÈxÈxÈyÈxÈyXÈ{dÈ|ÈzÈ{dÈ|JÈzÈxÈwLÈw+ÈvÈu`ÈtÈvfÈnÈXÈt9ÈvÈq'È\ÈMÈHRÈMÈQÈsuÈuÈuÈzÈzÈ|È}/È{È~5È|ÈyÈ|JÈ}qÈ{DÈ{#Èu?ÈvÈdÈaÈZ^ÈUÈeÈbÈ_}È\ÈZ^ÈU`ÈUÈ[ÈUÈ]ÈVÈJÈBÈQ'È;ÈSTÈU`ÈZÈvÈyyÈzÈyyÈyÈz^ÈzÈyÈv%ÈyÈu?ÈzÈvÈrÈrÈvÈx1ÈvÈt9ÈtZÈtÈsÈv%ÈuÈu`ÈwLÈz=ÈxÈvÈw+Èw ÈwÈxsÈyÈyyÈxÈyXÈzÈ{È|jÈ{ÈzÈzÈ|È{È{È{È{ÈzÈyÈzÈ{#ÈzÈz^ÈzÈ{DÈzÈzÈzÈzÈz^ÈzÈyÈxÈxÈy7Èz^ÈzÈyÈzÈ|)È|JÈzÈ{DÈ{#Èz=È{ÈzÈxÈvfÈp!ÈyÈuÈm/ÈSTÈG+ÈC3ÈÈ!ÈÈBNÈiÈvFÈ|È|È|È{È|È{È|JÈzÈz^È{#Èz^ÈzÈ|)ÈzÈyÈyÈxÈ{#ÈxsÈ{ÈqhÈgÈZÈVÈUÈQÈPÈ+È7mÈSÈ[ÈpÈtÈtÈyÈxÈxÈyÈ{DÈyÈxÈwLÈyÈy7ÈwÈwÈwÈxÈxÈyÈxÈwÈqÈt{Èz=È{DÈtZÈvÈkÈbÈrÈyyÈxÈxsÈwmÈvÈvÈvÈvÈvFÈxÈz^È{ÈyyÈzÈ{ÈyyÈy7ÈyÈyÈxÈwÈxRÈz=Èy7ÈwÈxÈxÈx1ÈxRÈxRÈxÈz^ÈzÈyÈz=ÈzÈz=Èy7ÈxÈxÈyyÈz^ÈyÈy7ÈzÈzÈyÈzÈ|JÈ{DÈ|jÈ{È|ÈvfÈxÈ^5ÈQÈT{ÈkÈ^ÈQÈ;#È4ZÈ:=ÈQÈfÈo}ÈwLÈvÈwLÈzÈzÈ}/È}/È|È{Èz=È{È{ÈyÈy7È{È{#È{DÈyÈ{ÈvfÈwmÈljÈkÈaHÈYÈWLÈGÈ5È)ÈUÈdÈtÈy7ÈzÈyÈz=ÈzÈ{#ÈzÈyÈxÈwÈxÈzÈ|È{#Èz=ÈxsÈxÈzÈzÈzÈxRÈuÈz^ÈzÈ{È|ÈkÈTÈt9ÈwmÈw+ÈxÈyXÈsuÈtÈroÈzÈxÈvÈzÈ|)È{DÈ{#È{#ÈzÈyÈzÈy7ÈxsÈxÈy7ÈxÈxsÈyÈyyÈyÈyXÈyXÈyÈyÈyÈyÈyÈzÈ{È{dÈ{DÈ|È{ÈzÈzÈzÈzÈ{È{È{DÈ{È}PÈ|)È{ÈzÈ{dÈuÈuÈ_ÈL)ÈP!È\jÈ_ÈNwÈMPÈTÈUÈSÈVfÈVÈR-È_ÈhÈtÈ{#ÈzÈ}È~5È|jÈ|jÈ|È}È{DÈyÈz=ÈzÈ|)È{È{È|jÈv%È]ÈYÈaÈ\ÈXÈG È3TÈ'LÈ1'ÈiÈwÈxsÈzÈ{#È{dÈ{DÈ{DÈzÈz^ÈyyÈxÈzÈzÈz=ÈzÈz^ÈxÈx1ÈyXÈz=È{#È|È|)È{#Èy7Èy7Èz=Èy7ÈuÈyÈxRÈz=ÈzÈzÈz=ÈvÈtÈuÈyÈwÈwÈyyÈyÈzÈzÈzÈ{#ÈyÈxRÈyÈzÈyÈxsÈyÈ{dÈ{ÈzÈzÈz^ÈzÈzÈzÈz=ÈzÈzÈzÈ{È{#È{È|È|JÈ{È|JÈ|È{dÈ|jÈ{È{È{Èz^È{#È{dÈ|ÈxRÈuÈVÈQÈSÈUÈb È]È[#È[ÈYyÈYÈVÈFÈCÈLÈVÈ[ÈyÈz=È{È|JÈ}/È|jÈ{È{dÈ|È{È|)ÈzÈ{dÈ|)ÈwÈxÈrÈcÈRÈNÈ^ÈZÈPÈAÈ)ÈÈ+Èr-ÈyÈzÈyÈxÈxÈxRÈvFÈxÈyÈyÈz^È{ÈzÈzÈ{dÈyyÈyyÈ{dÈ{È|JÈz=ÈzÈzÈzÈ{ÈxÈwLÈw+Èu`ÈuÈyXÈsÈrÈv%Èw+ÈyÈvÈy7ÈxÈxÈzÈzÈyÈ{ÈyÈyÈyÈyÈ{#È|jÈ{ÈzÈ{È{ÈzÈzÈz^ÈyÈyÈzÈyÈyyÈ{È{DÈ{#È{È{È{È|È|È|È}qÈ|È|È|)È|JÈ|È|È{ÈyyÈ|È}ÈxÈxRÈmÈ_È\)ÈKdÈQÈ]Èd9ÈYÈPbÈRÈTÈJÈ.wÈ1È8RÈLÈx1È{dÈ{È{È|È}PÈ{È|)È{È|JÈ{ÈyÈ{dÈ}PÈxÈx1Ès3È_È:ÈMÈfFÈkÈh1ÈXRÈ5ÈÈ)ÈqhÈvÈvÈzÈx1Èz=Èy7Èw ÈyÈyyÈwÈyÈzÈxÈxÈyÈwÈxÈ{È{Èx1ÈwÈy7ÈyÈzÈ{È{ÈyÈuÈx1ÈoÈd{ÈO\ÈSTÈqÈtÈvÈxÈw+ÈwÈxÈ{È|ÈzÈz=ÈyyÈyyÈyÈyÈzÈ{dÈzÈzÈzÈyyÈyXÈyÈxsÈxÈyÈyÈyyÈyÈzÈ{DÈ{È|È|JÈ|È|jÈ{È|jÈ|È|È|È|È|)È|)È}È}PÈzÈ|JÈ|jÈzÈx1ÈqÈQÈSÈPbÈCÈ5?ÈGmÈMÈKDÈLJÈOÈO;ÈCÈ:È6fÈkDÈyÈ|)È{È|È|È}/È|È|È|È}PÈ}ÈzÈy7È|Èy7ÈvÈqÈUÈ;dÈPÈ[È]È[dÈ[DÈAÈ"È81ÈpÈrNÈ\ÈxÈxÈ{È|È|)È}PÈ|ÈyÈ{dÈzÈwÈwmÈxÈx1ÈxÈzÈy7ÈwÈwÈxsÈxÈyXÈyyÈvÈpÈxÈ`È=È=PÈ@ÈBoÈ\ÈbÈ^VÈwÈvÈxÈxÈz=ÈzÈzÈxÈxÈyÈyÈyÈz^ÈyÈyyÈz=ÈzÈyÈyXÈy7ÈxÈxÈyXÈyÈzÈ{È{#È{È|)È{È{#È{È{È{È|JÈ{ÈzÈ{dÈ|È{È{È|È{È{È{dÈ|Èy7ÈyÈyÈnÈ\jÈ^ÈPÈ5ÈqÈ6fÈHsÈKÈB-È=qÈ?}È@BÈM/ÈwLÈw+È{dÈ{È|jÈ}È|jÈ|È|È|)È{DÈ{dÈzÈ{dÈzÈzÈs3ÈsuÈZÈNÈYÈQÈRoÈT{ÈYÈUÈ@ÈjÈtÈe`Èd{ÈxÈwÈ{#È}PÈ}È|È{ÈzÈ{È{DÈyXÈyÈzÈyÈzÈ{ÈzÈzÈz^Èz^Èy7ÈvÈqÈjÈh1ÈYÈ'LÈ\È1ÈCTÈHÈ=È<ÈHÈmPÈwmÈwmÈxÈxÈyÈzÈyXÈwÈwÈxsÈxÈyÈxsÈwÈxRÈyÈxÈxÈyÈxÈxsÈxsÈyÈzÈz^ÈyÈ|JÈ|JÈzÈyÈyXÈyÈzÈzÈyÈyÈ{#È{ÈzÈ|JÈ{#ÈyÈ{DÈ{È|JÈzÈyÈuÈvÈpBÈ_;ÈgÈVfÈÈ\È:=ÈGÈ3È%È" È4ÈkdÈwÈyÈ{dÈ|È{È|È|JÈ|È|)È{DÈ{È{#È{È{È{ÈzÈtÈo}ÈNÈE`ÈUÈGÈ8RÈ?}ÈJÈ[ÈtÈxÈqhÈ]qÈ`Èz=ÈwÈzÈ|È{DÈ|JÈ|È{ÈzÈyÈy7ÈyÈyÈxÈyyÈyÈyÈyXÈ{È{dÈyÈtÈmÈ\È2NÈÇÈÈ.VÈGmÈMÈFÈ7È<ÈPÈkÈwÈzÈxRÈwÈyXÈyÈwÈwÈxÈxÈxsÈx1ÈxRÈyÈyÈy7ÈxRÈwÈxsÈxÈxÈxÈx1ÈwÈyXÈ{DÈz^ÈyXÈy7Èy7ÈyÈyyÈz^È|È|)È|È{dÈzÈ}PÈ}PÈzÈ{dÈ|JÈ|)Èy7Èw ÈzÈrÈnÈjÈa'ÈRÈÇÈ" ÈCÈB È=È2È<ÈrÈxRÈy7ÈyÈ{DÈ{È~È}È|È|È|È|jÈ|È|JÈxÈz=ÈzÈvÈo}ÈrÈ@ÈLÈPbÈ+dÈ/ÈBÈQÈsÈxÈoÈZÈlÈyXÈzÈxÈ{È{#È{#ÈzÈyÈxÈw ÈvÈwÈwÈvÈwÈxÈxÈyÈyÈzÈxÈsÈk#È:ÈPÈÇÇÈÈ1È5`È9È;#È6%È<)ÈLJÈiyÈvÈwmÈv%ÈwÈxÈwÈxsÈxÈxsÈwÈwÈxÈxRÈxÈyÈyÈxÈyÈyÈxÈxÈx1ÈwLÈwÈxÈxÈwÈw ÈvÈwLÈw+ÈxRÈzÈyÈz=È{È{È{È{ÈzÈ|È{DÈy7È{ÈxÈ{Èr ÈlÈaHÈZÈK#ÈÇmÈÈ4ÈBÈTÈjÈmÈzÈwÈvÈyÈ{DÈ{ÈzÈyXÈ{È|È|È{#Èz=ÈyÈyÈzÈ{ÈxÈsÈuÈPÈ0ÈEÈFÈMPÈ_ÈtÈ{ÈyXÈu?ÈqÈsÈvfÈwÈwÈz^Èz=ÈyÈwÈv%ÈvÈw+ÈvÈwÈwÈw ÈxsÈyXÈyXÈyXÈzÈ{DÈxÈsÈiÈ8È"NÈÈÈVÈ ÈDÈ%È0!È2È-/È%`È1hÈQÈrÈuÈuÈwLÈw ÈvÈxÈyXÈx1ÈxÈy7ÈyÈvÈuÈxÈyÈyXÈx1ÈvÈvÈwÈyÈxÈxÈxsÈxRÈwÈvÈuÈuÈvÈxÈzÈzÈz=È{#È{ÈyÈyÈyÈyÈ{Èy7Èy7ÈxÈxÈsÈg+ÈVÈTÈJÈÈ jÈ(RÈ=qÈD9ÈlÈt{ÈuÈxÈwÈv%ÈxRÈz=ÈyÈvÈtZÈuÈwÈyyÈyXÈ|)ÈzÈyÈz^ÈyXÈuÈvÈv%ÈXÈ@È-ÈVÈbNÈkdÈwLÈxÈxÈwÈw ÈvFÈw Èx1ÈxÈyÈyÈxÈvÈuÈw ÈwLÈuÈuÈw ÈwmÈxRÈxÈxÈyXÈzÈyÈz^ÈvfÈo;ÈYÈEÈ:È1'È3È5ÈB È@BÈ>È7+È(ÈÈ(sÈNÈtÈvÈuÈvfÈvÈwÈyXÈyÈyÈzÈyÈyyÈyXÈyÈz=Èz^ÈyÈyÈz^Èz=È{ÈzÈxÈxÈwÈvÈvÈuÈtÈtZÈu`ÈwÈyXÈzÈz^ÈzÈyÈyÈxÈw ÈxÈzÈwÈxÈz^ÈwÈvÈfÈ\JÈVÈ1ÈfÈÈÈ9ÈBNÈmÈp!ÈsÈxsÈxÈu`ÈvfÈvÈvÈt9ÈsTÈsÈsTÈuÈxsÈzÈxÈyXÈyÈyyÈwmÈzÈuÈsTÈZ=ÈU?ÈaÈpÈwmÈzÈ{ÈzÈzÈz=ÈwÈvÈwÈxÈwÈvÈw ÈxÈxÈxRÈwÈuÈuÈvFÈw ÈwÈxÈyyÈ{#È{Èy7ÈyXÈ{#ÈtÈqÈ]ÈRoÈPÈTZÈmÈpÈVFÈO\È?\È.È!HÈ,ÈG ÈvfÈu`ÈsÈu`Èw+ÈxÈyÈzÈyÈxÈvÈvÈyÈ{È|È|jÈ{È|È{dÈzÈ{ÈyyÈw Èw Èv%ÈtÈsTÈsÈt9ÈsÈtÈvÈy7ÈxÈwÈxÈyÈxÈwmÈtÈvfÈxÈxÈwÈxÈwÈu`ÈgÈh1ÈUÈ(È}ÈqÈ%È=ÈmÈqÈpbÈtÈxÈwÈuÈuÈu?ÈtÈqhÈq'ÈsÈu?ÈtÈvÈxÈxÈvÈwLÈwLÈwmÈvÈvFÈt{ÈrÈrÈtÈvÈxÈ|È{ÈxsÈwÈwÈwmÈx1ÈxÈx1ÈvFÈuÈvÈxÈy7ÈxÈxÈyXÈy7ÈxRÈwmÈwÈxsÈwÈwÈwÈwÈxÈyÈwÈt{ÈroÈpÈqÈtÈu?ÈtZÈt9Èm/ÈNwÈHRÈAÈ@ÈeÈtÈrÈsTÈvÈwÈxRÈyÈxÈxÈvÈuÈu?ÈvFÈvfÈvÈyyÈ{È{DÈyÈxÈyÈwÈw+ÈwLÈuÈrÈr-Èt{ÈuÈsÈtÈwLÈxÈxRÈwÈxÈxsÈvÈuÈsÈu`ÈxRÈxÈwLÈuÈwÈvÈi7È^ÈO}È/È-È6ÈNVÈrÈyXÈsÈtZÈtÈvFÈvfÈtÈsÈsÈsTÈqHÈqÈrÈtZÈsuÈsÈuÈw+ÈtÈtÈvÈwÈw+Èv%ÈvfÈwLÈwmÈwmÈwÈyÈ{ÈyÈwÈvÈvFÈv%Èw ÈwÈwÈw ÈvÈvÈw+ÈwÈx1ÈxsÈwÈvÈv%ÈvÈvÈwÈwÈvÈuÈtZÈvFÈvÈtÈu`ÈwÈyyÈyÈwLÈwLÈ{#ÈyÈxÈroÈ\È]/Èn5ÈsTÈtÈrÈtÈwÈxÈyXÈzÈ{dÈ{#ÈxÈuÈtÈuÈtÈuÈvÈwLÈvÈvÈw+Èv%ÈtÈuÈw+ÈvÈt{ÈtZÈvÈvfÈt9Èt9ÈvfÈvÈvÈwLÈwÈwLÈvÈuÈsÈt{ÈvÈwmÈvfÈtÈwÈv%ÈiXÈ\JÈIÈ5È4È>ÈnÈvÈvÈwÈvfÈsÈt{Èu?ÈtÈsÈt{Èu?ÈtZÈs3ÈsÈt{ÈtZÈtÈvÈvÈvÈvÈxÈyXÈwÈvÈvÈw+ÈvFÈuÈv%ÈvÈvÈv%Èw+Èw Èu`ÈtÈtÈtZÈtÈu?ÈuÈuÈuÈuÈvÈxsÈxÈwÈw+Èx1ÈyÈxÈxÈxÈwÈvÈwÈyÈyÈyÈyÈz^È{È{dÈyyÈyÈyÈyÈ{Èw+ÈvFÈyÈxsÈvÈuÈvÈxÈxRÈxÈ{DÈ{ÈyÈw ÈvÈw+Èw+ÈvÈvÈvfÈuÈtÈuÈuÈtÈsÈtÈvÈw+ÈvÈvÈvÈvFÈt9ÈsÈtZÈtÈvÈvÈw+ÈvÈuÈuÈvÈvfÈwÈwÈvFÈt9ÈxsÈu`ÈaÈ\ÈSÈHÈjÈpBÈwÈyÈzÈyÈxÈvÈvfÈuÈu`ÈtÈu`ÈuÈu`ÈtÈuÈvÈvÈv%ÈwÈwÈxsÈwÈx1ÈwÈvFÈuÈtÈt{ÈtZÈtÈvfÈvÈuÈv%ÈvÈvÈv%ÈtÈtÈtÈsÈsÈtZÈu?ÈuÈuÈu?ÈvÈwÈyÈzÈz^ÈyÈyXÈyÈxÈxsÈx1ÈxsÈxÈxÈwÈxsÈzÈ{dÈxÈvfÈuÈv%Èy7È{dÈ{#ÈzÈxÈvÈuÈuÈvFÈwÈuÈtÈk#ÈtÈvÈw+ÈwÈwÈw+ÈvFÈuÈuÈu?Èu?ÈuÈvÈu`Èt{ÈtÈt9Èt{Èt9ÈsÈsÈr-ÈroÈsTÈsÈt9ÈuÈw ÈwmÈwmÈuÈtZÈtÈuÈw ÈwmÈvfÈtZÈvfÈr È^È]qÈYÈmÈuÈxRÈyÈ|)Èx1ÈwLÈxÈyÈxÈw+ÈvÈtÈtÈtÈt{ÈuÈvFÈvÈvfÈw ÈxsÈyÈuÈuÈu`ÈuÈu`Èu`ÈuÈvfÈvFÈvÈwmÈwLÈvfÈvÈvÈwLÈwLÈw ÈwLÈwÈvÈvÈw ÈwÈxsÈx1Èw+ÈvfÈwLÈxRÈxÈxÈxÈyÈzÈyÈyXÈyXÈxÈxsÈwÈwmÈwÈxsÈxsÈw ÈvFÈw ÈxRÈxÈxsÈw+ÈvfÈvFÈu`ÈtÈtZÈtÈsÈpÈeÈn5ÈqÈv%Èy7ÈyÈyÈxsÈwÈwmÈwÈxsÈxÈwÈvÈvFÈuÈtÈtZÈtÈuÈuÈtÈsÈtÈuÈuÈu`ÈuÈvÈw+ÈwÈxÈwÈvÈuÈu?ÈuÈvÈuÈtÈpÈeÈgÈd{ÈroÈwmÈ{dÈ{#ÈyyÈvÈvÈw ÈwÈvÈuÈuÈvfÈvÈvFÈuÈuÈuÈuÈtÈsÈtÈuÈsÈrÈsuÈtÈuÈuÈuÈuÈvfÈwLÈwÈwÈwÈxÈyyÈyÈyÈyXÈxÈxÈxsÈxRÈxsÈxÈxÈyXÈyÈzÈzÈzÈz=ÈyÈyyÈz=ÈzÈz^ÈyÈyÈyÈzÈzÈzÈzÈz=ÈyÈyÈzÈyÈxÈvfÈu?Èt9Èt9Èu`ÈuÈuÈvÈuÈtÈsÈr ÈroÈsÈvFÈxÈxÈyÈxÈyyÈzÈ{#ÈzÈyÈxÈx1ÈwÈw+ÈvFÈuÈuÈvÈvÈvÈw+ÈwÈx1ÈxsÈxsÈwÈvÈuÈvfÈxRÈyyÈy7ÈxRÈwÈxÈyÈwÈvFÈuÈmqÈnwÈkÈtZÈw+ÈyÈ{Èz=ÈyÈy7Èx1ÈwLÈvFÈuÈvÈvÈw+Èw+ÈwLÈwÈwmÈw Èv%ÈtÈsÈs3ÈuÈu`Èu?ÈuÈvÈvFÈvÈwmÈxRÈxÈxRÈxÈyÈyÈyÈzÈzÈyyÈxÈxÈxsÈwÈwmÈwmÈwÈxRÈy7ÈzÈ{È{dÈ{DÈzÈz=ÈyÈyÈyÈz^ÈzÈzÈ{È{DÈ{È{È|È{ÈzÈzÈzÈxÈwÈvÈvÈw+Èw+ÈwLÈwmÈw+Èw ÈvÈv%Èv%ÈvfÈwÈxÈyÈyyÈwÈwÈxsÈyÈxÈxRÈxÈyÈyÈwÈvÈu?ÈtÈsÈsuÈsTÈt9ÈuÈwLÈxÈy7ÈxÈxsÈwÈuÈtÈuÈvÈwÈx1ÈxRÈxÈxsÈxÈyÈw+Èj^ÈcTÈnÈroÈvÈxÈyÈy7ÈxÈxsÈwÈwÈwÈwÈwÈxÈyyÈyÈyÈx1ÈwmÈw ÈvÈvÈvÈvÈt{ÈsuÈrÈrNÈroÈs3ÈtZÈuÈvÈw+ÈwÈxÈxsÈxÈxsÈxÈyÈyyÈyÈyÈyÈwÈvÈuÈvÈwÈxÈyÈyÈyÈz=ÈyÈyÈyÈyyÈyÈz=Èz^ÈzÈyÈyÈyÈzÈ{ÈzÈy7ÈxRÈwÈwÈvÈuÈu`Èu`ÈuÈvFÈvFÈuÈt9ÈrÈqÈqÈroÈs3ÈsuÈsÈsÈt9ÈuÈv%ÈvÈvÈw+ÈwÈxsÈx1ÈvÈtÈsuÈroÈqÈqÈqÈr-ÈsÈsÈtÈuÈvÈwÈxsÈxÈvÈu?ÈtÈtÈtÈtÈuÈvFÈwÈxÈv%ÈqHÈdÈbÈr-ÈvÈxÈxÈvÈu?ÈtÈuÈvÈwmÈxRÈyXÈyÈzÈ{DÈz^ÈxÈwÈwÈwÈwLÈvfÈuÈaÈcÈb-Èe`ÈiÈkdÈl)ÈnÈoÈqhÈs3ÈuÈvÈwÈxÈxÈwÈvÈuÈt9ÈrNÈqÈqHÈs3ÈuÈv%ÈvÈu`Èt9ÈsTÈrÈs3ÈsÈsÈtÈvFÈxRÈyyÈyyÈy7ÈxÈxÈxÈyXÈyÈyÈyÈxÈxÈxÈx1ÈxÈyyÈyÈy7ÈxÈuÈsTÈpÈo}ÈnÈnÈn5ÈnÈnwÈo}ÈpÈr ÈsÈsÈtÈvÈvÈvÈvFÈuÈtÈs3ÈrNÈqÈqÈqÈqÈr-ÈrÈsuÈsÈt{ÈuÈvÈwÈwÈw+ÈvÈvFÈv%Èv%ÈvÈwLÈwÈvÈtÈsTÈroÈs3Èu`Èv%ÈtÈs3ÈqÈpÈo\Èp!ÈqÈtZÈvÈwÈwÈv%ÈtZÈrÈqÈpÈnwÈlÈkÈgÈbÈLÈKdÈKDÈMÈNÈPÈPÈQÈRÈUÈYyÈ_;ÈcÈeÈeÈeÈfÈeÈeÈbÈ^È^È`bÈcTÈd{ÈcÈ`È\ÈZ=ÈWLÈVfÈYÈZ^È]qÈboÈfÈgÈgLÈffÈfÈfÈgÈjÈmPÈpÈsÈuÈvÈu?ÈsÈqÈo}ÈmqÈkÈjÈiXÈhÈiÈj=ÈkdÈkÈkÈjÈj=ÈiÈjÈjÈkDÈkDÈkÈlÈnÈo\Èo\ÈnVÈm/ÈlÈmqÈnVÈnÈo\ÈoÈpÈqÈrÈt9ÈuÈv%Èw+ÈwÈwmÈvÈvÈvfÈvFÈvÈuÈtÈtÈsÈsuÈs3ÈrÈroÈq'ÈoÈmÈkÈh1Èd{ÈaÈ_;È_ÈboÈfÈiÈkÈiyÈe`Èa'È]PÈYÈVfÈT9ÈSÈT{ÈRÈOÈ>È;dÈ9È8RÈ6È5È6fÈ6È7È9È<È>È@bÈ@È?;È@ÈCÈEÈHÈLJÈO\ÈQÈS3ÈS3ÈQÈLÈHÈGÈFÈFÈ@ÈÈ0È0BÈ0È5?È7ÈÈ<È:È<È@ÈGÈKÈRÈSÈNÈEÈ>È:^È9È8È;È9È5È.È%ÈJÈ{ÈuÈÈÈÈÈ"-È(RÈ,)È.È2-È4ZÈ6È7LÈ5È2 È-È)È$È!ÈqÈdÈ)ÈÈÈ/ÈÈ!È%È'È-È0BÈ-È(1È"ÈwÈDÈ ÈÈBÈVÈ È )ÈÈÈ}È+#È9ÈH1ÈP!ÈWÈ]qÈcuÈeÈeÈdÈcÈbÈbÈcÈeÈfÈfÈeÈcuÈ]qÈX1ÈTÈNÈG È=È1HÈ)È(sÈ(RÈ,JÈ2È;ÈDÈJÈNÈQÈQÈMÈIÈCÈ@!È=/È;#È9È8È6È4È3È(È/È7 È@bÈJÈPBÈPÈLjÈHÈDZÈ?}È8RÈ5?È6È9È;DÈ4È97ÈAÈIXÈMqÈFÈ9yÈ+dÈwÈ È$È'È)ÈoÈÈ,JÈ!ÈÈ+È ÈÈÈ#È#TÈ*È.5È1È2È1hÈ1È3uÈ6È7È6È4È.5È*È-/È-È,È+È'+È$È&È'+È' È&È#È\ÈRÈÈ ÈoÇ)ÇÇÇ-Ç;ÇPÇÇdÇJÇÇ%ÇVÈRÈ-ÈÈ BÈ%?È(È-È.È.È/È0È2 È4È7mÈ:È?\ÈC3ÈCÈCuÈEÈ@!È81È)ÈÈÈ9ÈÈ5È)7È4ZÈ>ÈHÈMÈOÈNVÈKDÈF%È?}È8sÈ2oÈ+È&fÈ#3È ÈÈ bÈ#È:=ÈB ÈB ÈDÈÈ<È6È/È&FÈDÈÈ+È!ÇÇÇTÇÇ'ÇBÇÇÇÇ ÇÇÇÇÇÈÈÈÈ È È )ÈÈÈÈFÈ+ÈÈÈÈjÈÈwÈÈ%È ÈLÇJÈÈÈ È+#È5È=ÈCÈFfÈDÈA'È:È1È(È!ÈÈdÈÈJÈÈ È)È+#È1È3È2 È*=È+#È'È%È#È&È)È-PÈ5È8RÈ;È;dÈ8È5`È4È8ÈBÈIXÈG+È>È8RÈ1È4È/È.5È0BÈ0!È+È%È È !È+dÈ7È:=È9È6È33È/È*È%È!hÈ!HÈ&È,)È0BÈ0bÈ-È(RÈ#uÈ!'È#3È)È0BÈ2È2È@È?È@È>È9È1HÈ&È#ÈÈÇÇÇjÇÇÇFÇ ÇRÇdÇbÇÇÇÈÈÈ ÈÈÈÈÈÈ ÈÈ yÈ È È ÈÈsÈÈ`ÈTÈÇVÇÇ}ÈNÈÈ ÈÈ#È(È-È2È5È6%È5`È2È.È'LÈ È bÈÈ!ÈZÈ!'È'È(È6È8È#3È#È"È}ÈÈÈÈÈ ÈÈÈÈÈÈ1ÈqÈ$È+dÈ33È>ÈC3ÈH1ÈLjÈHÈGÈHÈHsÈEÈ@È:È3TÈ(È=È1È#uÈ=PÈP!ÈWÈXÈUÈSÈQÈNwÈJÈFÈDÈAÈ=È9È6%È2È1hÈ2NÈ4È8È:È:È;ÈIÈLÈKÈJÈEÈ=È3È'È=È ÇÇÇuÇÇ?ÇÇ9ÇmÇ?ÇmÇÇZÇDÇЃÇÇÇÇÈZÈÈBÈÈ1È/È!hÈ&È(RÈ)È)È)È)yÈ"È!'È!'È!È"È"oÈ È;ÈwÈjÈ7È"È%È(È.È3È7 È9È9yÈÈ+È!HÈ&%È+È/È/}È,È(È$È"È È}ÈÈÈÈJÈÈÈÈÈ;È JÈ È )È ÈbÈuÈÈ#È5È!hÈ$ZÈ(È.È2oÈ4È4{È0bÈ)yÈ(È.È97ÈCÈOÈTÈQÈLJÈFÈB-È=È:=È7È5È33È1È0bÈ/È/È.È.wÈ/È0È2oÈ4È8ÈU?ÈHÈKÈNÈKÈC3È;È8È6È,jÈÈ ÇÇÇ?ÇÇ`ÇÇyÇ=Ç;ÇÇÇÇBÇJÇLÇ'ÇRÇ)ÇÇÇÇÇÇÇÇÈÈÈ8sÈD9ÈJÈGLÈDÈ<)È6È.wÈ&FÈ/ÈÈVÈ yÈÈ'ÇÇÇÇ}ÈTÈ )È#È)È0!È#TÈ'LÈ)È*È*È)È'È$È%?È#3È ÈwÈÈXÈÈÈ7ÈÈ È#È"NÈ ÈPÈDÈÈÈÈÈÈÈÈÈ È#uÈ&FÈ)yÈ-qÈ2NÈ6È:^È;È9È5È0È-È+È(È&FÈ#È" È È È BÈ!'È"È$È(1È,)È0!È3È7+È9yÈ;ÈBoÈR-È\)È^È`BÈ^ÈWÈLÈBNÈ7È0È)È!È`ÈÇ+ÇÇÇHÇÇɺÇ1ÇÇ)ÇЃÇԼÇXÇVÇÇÇjÇ!ÇÇÇqÇ}È ÇÈbÈLÈhÈ${È<)È;ÈAÈ>wÈ8RÈ1È+È%È ÈÈwÈÈ5ÈPÈ}È^È#È'+ÈÈ È,È1'È1È(È)È+È+È,È+DÈ)yÈ'mÈ#uÈ!È !ÈÈÈÈÈdÈÈÈÈdÈÈÈÈÈÈVÈ !È" È#uÈ#È$È%È&È'mÈ'È&È%È$È#3È"-È!HÈ È È BÈÈÈÈ È È!È"È$È&fÈ(sÈ*È-È0È3TÈ6È8RÈ:^È<È>VÈ?ÈDÈFÈJÈWÈXÈXÈWÈMÈNwÈPÈNÈKDÈGÈEÈ=È:^È7È5`È2È.È3TÈ,È-È,È)XÈ*^È+È*È,È.È0È9È=È1È0È/È=ÈwÈ<È81È\Ѧ*;Ij I>HW]/P{-npU$?|o% @aKaq9ۚb>=`޿[ 4' 8 $EħV3:ˢVWBL#:jeKMV+ڃ8;\bdGbv5[ 8"- 9 T( ,sꌹY #,8YX͠%kIz1R=rYw%4R0e}b>a @8ђB<} Z0 S$Y(ŷ>3w.|;Q~GGkoń363NRf].u;uY6aLٻy+/FSSE_R7 OHDR  ?@4 4  G 0CLASSDIMENSION_SCALE "NAMExmxOCHK <YOCHK! 4 _Netcdf4Dimid  ?standard_nameprojection_x_coordinate B long_namex coordinate of projection !unitsm)7OeFRHP  (QBTHDd( F|BTHD  d( kpxFSHDPx(B%%MjBTLF!6L X KX h20PD\J PVP`A[Y`מ`_B W` 8 ]CúY`X5{HCBTLF CY`P PY`h!6W`PX  _B -SOHDR  ?@4 4J  G 0CLASSDIMENSION_SCALE "NAMEygOCHKV ry 8pOCHK9 4 _Netcdf4Dimid  ?standard_nameprojection_y_coordinate B long_namey coordinate of projection !unitsmPnDOCHK @ J_NCProperties"version=2,netcdf=4.7.0,hdf5=1.8.16>:VzFHDBLW spatial_refpPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]FHIB OxFHDB,grid_mapping_nametransverse_mercatorlongitude_of_central_meridian ?@4 4@]false_easting ?@4 4Afalse_northing ?@4 4latitude_of_projection_origin ?@4 4!scale_factor_at_central_meridian ?@4 4x#? long_nameCRS definitionlongitude_of_prime_meridian ?@4 4semi_major_axis ?@4 4TXAinverse_flattening ?@4 4Uuor@ GeoTransform440720 60 0 3751320 0 -60 AAAAxAhAXAHA8A(AAAAAAAAAAALALALAݜLALALA7LAULAsLALALA͝LALA LA'LAELAcLALALALAskkkkksck΄k{{k{k{{cs{Jsc{csZcsZcckcck{kkkscscckssZ{skZkskZc{sss{{sck{ccsccs{c{c{{k{ckksskck{{{k{{ssZkkkkkc{s{c{kcs{{k{{{kccs{kksks{{k{{ss{s{{csc{ssk{s{{kssksc{cckŭc{sc{{ss{ksc{sksss{{{kk{{{s{s{s{ksksss{sks{kssksksk{ssk{{c{ck{skkk{sOHDR (  > P _Netcdf4Coordinates JvOOCHKxgBand1FOCHK : long_nameGDAL Band Number 1 ; grid_mappingtransverse_mercator `DIMENSION_LIST%%˒9OCHKG tREFERENCE_LISTdatasetdimension ,OCHKG tREFERENCE_LISTdatasetdimension  GCOL  ggdalautotest-3.2.2/gdrivers/data/netcdf/sen3_sral_mwr_fake_standard_measurement.nc0000664000175000017500000005052214020414072027246 0ustar evenevenHDF  RQ`OHDR "O nJ . ConventionsCF-1.6 3 mission_name Sentinel 3A 4altimeter_sensor_nameSRAL 3radiometer_sensor_nameMWR `semi_major_ellipsoid_axis ?@4 4@TXA Xellipsoid_flattening ?@4 4'Zwk?!ՁOHDR  ?@4 4A GP 0CLASSDIMENSION_SCALE (NAMEtime_01YHOCHK?XWOCHK PF, 4 _Netcdf4Dimid  1 long_name UTC: 1 Hz Cunits#seconds since 2000-01-01 00:00:00.0 ,standard_nametime 1 calendar gregorianCKOHDR  ?@4 4G GP 0CLASSDIMENSION_SCALEPeGO OCHK +NAME time_20_ku 4 _Netcdf4Dimid  : long_nameUTC: 20 Hz Ku band Cunits#seconds since 2000-01-01 00:00:00.0 ,standard_nametime 1 calendar gregorian- OHDR  ?@4 4 I GP 0CLASSDIMENSION_SCALE *NAME time_20_cV+.BTHD  d(PD #5RFSSE^>}6/OCHKh@ 4 _Netcdf4Dimid  9 long_nameUTC: 20 Hz C band Cunits#seconds since 2000-01-01 00:00:00.0 ,standard_nametime 1 calendar gregorian(OHDR     p 7 long_namelatitude : 1 Hz -units degrees_northOCHK ,units degrees_eastH6OCHK,v 0standard_namelatitude P add_offset ?@4 4 P scale_factor ?@4 4ư> hcommentHPositive latitude is North latitude, negative latitude is South latitude..KOHDR    iV 8 long_namelongitude : 1 Hz ,units degrees_eastGHFSSE-QـBTHDd(PB p OCHKV=v 1standard_name longitude P add_offset ?@4 4 P scale_factor ?@4 4ư> Mcomment-East longitude relative to Greenwich meridianDFOHDR <   Q @ long_namelatitude : 20 Hz Ku band PDIMENSION_LISTz,!OCHK -units degrees_north 0standard_namelatitude P add_offset ?@4 4 P scale_factor ?@4 4ư> hcommentHPositive latitude is North latitude, negative latitude is South latitude4BOHDR =    Q A long_namelongitude : 20 Hz Ku bandp PDIMENSION_LISTz,9u9HOCHK ,units degrees_east 1standard_name longitude P add_offset ?@4 4 P scale_factor ?@4 4ư> Mcomment-East longitude relative to Greenwich meridian,OHDR    (Q ? long_namelatitude : 20 Hz C band>^OCHK 1standard_name longitudeeVOCHK -units degrees_north 0standard_namelatitude P add_offset ?@4 4 P scale_factor ?@4 4ư> hcommentHPositive latitude is North latitude, negative latitude is South latitude4BOHDR     @ long_namelongitude : 20 Hz C band` :p?kFRHPQ- LUBTHD d(-NBTHDd(]aFSHDQPx #hBTLFBg!!G$;';_Cw/*5I.UVک߉b,r,Sѓ&^L@"C$ h?@:BTLF/Lh  ' @" b, ! Mcomment-East longitude relative to Greenwich meridian OHDR   ?v A _FillValue ; long_namesurface type : 1 Hz D flag_values lflag_meaningsDocean_or_semi_enclosed_sea enclosed_sea_or_lake continental_ice land 5 coordinates lon_01 lat_01: OHDR    :Q ==GNOHDR   TAv B _FillValue D long_nameorbital altitude rate : 1 Hz #unitsm/s P add_offset ?@4 4 P scale_factor ?@4 4{Gz? 5 coordinates lon_01 lat_01 commentThe reference surface for the orbital altitude rate is the combined mean_sea_surface/geoid surface. It is used to compute the Doppler correction on the altimeter rangeUOHDR J   Av D _FillValue  ^ long_name6Altimeter-derived total electron content (TECU) : 1 Hz %unitscount P add_offset ?@4 4 P scale_factor ?@4 4 _B 5 coordinates lon_01 lat_019KOHDR   |Gv B _FillValue m long_nameENumber of waveforms summed in stack in SAR processing : 20 Hz Ku band %unitscount ; coordinateslon_20_ku lat_20_ku ^comment>Number of multilooked beams used to form the SAR mode waveform6&OCHKQ PDIMENSION_LISTz,,GCOLbbbb b b OCHKQ PDIMENSION_LISTz,phFRHP}^> (HjsFSHD}Px(`sOCHK PDIMENSION_LISTz,`ݛOCHK8Q PDIMENSION_LISTz,8{OCHK J_NCProperties"version=2,netcdf=4.7.0,hdf5=1.8.163D OCHK0Q PDIMENSION_LISTz,U@OCHKG tREFERENCE_LISTdatasetdimension dC3?OCHKBQ PDIMENSION_LISTz, nQoNOCHKFQ PDIMENSION_LISTz, yBTLFZHL  P&'D$[P^2,Hx/RS/`!i5_}3PcBTLF DZH!H P[P5S3P:01OCHKG  tREFERENCE_LISTdatasetdimension T  !$'?D OCHKNQ PDIMENSION_LISTz, OCHK tREFERENCE_LISTdatasetdimension )&FHDB=eHJ _FillValue  long_name altitude of the satellite : 1 Hzunitsmstandard_name height_above_reference_ellipsoid add_offset ?@4 4\%A scale_factor ?@4 4-C6? coordinates lon_01 lat_01comment3Altitude of satellite above the reference ellipsoidDIMENSION_LISTz,FHDBO]time_01b time_20_ku time_20_clat_01T lon_01  lat_20_ku lon_20_kulat_20_cdlon_20_cC surf_type_01 alt_01! orb_alt_rate_01$ total_electron_content_01' nb_stack_20_ku)?@ @@@@BB""BB""BB""gdalautotest-3.2.2/gdrivers/data/netcdf/complex.nc0000664000175000017500000002612614020414072020667 0ustar evenevenHDF  V,`OHDR " { __NCProperties7version=1|netcdflibversion=4.6.1|hdf5libversion=1.10.4 complex64K  Rr  i  r ?@4 4i ?@4 4OCHK@Z complex128 - ConventionsHello 3titleSimple Complex filex fileҁOHDR    ||Z 0CLASSDIMENSION_SCALE "NAMEX !OCHK8<>kOCHKX+ 4 _Netcdf4Dimid zQ _Netcdf4Dimid …OHDR    ||tZ 0CLASSDIMENSION_SCALE "NAMEY *;OCHK>Z>GOCHKZ* 4 _Netcdf4Dimid +OHDR *   |||) 0CLASSDIMENSION_SCALE "NAMEZ 4 _Netcdf4Dimid v= OCHKB@f325;OCHK 4 _Netcdf4Dimid  6jBBHBAHAHBzDD@@@@@@AA A A@A@A`A`AAAAAAAAAAAAAAAAABBBBBBBB B B(B(B0B0B8B8B@B@B@@@@"@"@(@(@.@.@2@2@5@5@8@8@;@;@>@>@@@@@B@B@C@C@E@E@F@F@H@H@I@I@K@K@L@L@N@N@O@O@P@P@@Q@@Q@R@R@??@@@@@@@@@@@@@@AAAA A A0A0A@A@APAPA`A`ApApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBB B BBBBBBBBB B B$B$B(B(B,B,B0B0B4B4B8B8BD 9D : 8) 9h 89D :]:}: 9 8) 9}9Sh 9) 9 8) 66i8v:ga;ň9h :!: :) :}:D :D : :) 8) 8) 9}9Sh 9 8 9) : j9D 9}9) 8;>D 99D 9D 9}6>X78`a989 8) :;|9}9D 9}: ;K:H 9};xg;N ;xg99}:h8) 9:>D 98) 9D 9 9D 99}9}8 838!8:49}:!:>D 8) 8) :}9) ;py;W:Í ;ň9;;;;U;.i 9;8:] 8) 8 8) 9) 9 :Sh 9h : 9Sh 983*8j \9L+:˨8) 9h 8) :H 9 8) ;;I;_;y< H8 8 988 : 999) :D :j8 8 8) 8 9}9 :ڻ5:d{:\N:5~:;::w;l:H 9) 8 9Sh 9}9) 9 9}:!:H 8 : ; j9:i :] ;{ :!8) :) :>D 9) 9) 9}9 : j9) ; ::2:G::yK<;RF;Au<;Š;;ɯ;|s;s;:W;;;Ͻ<ҫP8) : 8) 89Sh 9 ;h: j9}9}: :) ;ͳ$;;;;;;ɑ ;h;,y;^;;q<D 9}8 8) 9}9}:: ; :>D 9 8) 9) : :] ;<;8Z;S;w;`;GP;>;F;Bm;<^D :g:i 9:: :i ;m;H : ;e<m<<~< 7W<H<ڠ<ێ;q@;4;V<&=$Zg=l=^G=LC===|=&=^l=\]=ɨ=G==k=\=]==e l==z9Sh :] 8 ;{;˅;y<}F<~H<a >K>Pq>Z>4v>*>o>+j> >j=sG=Fe> =<=ˤ=y==:Sh :j;b;;,<\<뾋<⡹==\s=n=U>#K>p?>t>:> Q>|;>P >^[>C>>= > V=M=Y==ٔ=v9) 9Sh ;<2<<+<-<=ѡ=>Z>>(<'>\>w>> >Z>^>c(>V>Y>>L> <=T=q===T:Sh 8) : ;;8 8) <7);ԯu;q>>,&O>Nq>a>}>r>O-r>; e>N >M>)<>4l>%>=>"=S===8 9ٹ9C: P:(t;;S<,}<[`=W> >-d>E>b/>gf>S>@>7`V>D6>A>,6>,`<>D>Cca>#;n>"r>>R>eA8 9}9) ;] < :T:=:C;5Dx;o;Q~ ;S<_<+=+===[=i>&Y>A >.a>/->(>%>*ں>0>8L>&>&Mn>H*D>U0>S k>}$>f>(>>8) :] 8) 8) 9}: :S9C:\֮:>2;3;Y;6<}kƕ>>' > >$>!s>> S>!>!>&.>XF>>˦b?i?0Ҝ?6e?T9 ;:h:) 999T:AoF:};0{;09.a>']>'yb>$9>>iS>o>>@y7>{>`?V?C8?>2J?2^? b8) : 9 ;&{:!8:h:S2:: ;=$< i=<{(=]\=*=T7=u}=mU='=r=z>>6tM>Nf>G>>l>12>1ߴ>8>@J?T?? ?ݟ>I>;V ;[U:: :i:%::;#;,>>8>Uz>S>Eb> c=>>>Xm>>>>>I >^=><<,m;ň;# 8) ;sH:::B:&;7;S<= =6=8S=G==2>$>:>VG>PU>Q>]:>t>V>7>,>3G_>XK>y5>ep>m~>Q>4a>> D>]>np>i>v>9>ѩ>])>->4>>Jq>I4>e>qcM>B>>>[: :x:u:3:v/:[K;5;4e+;wg<#P=-,>g>yo>>q>z>ʝ>:>>k>>s>Y>_7f>W>K]>>%>%;cC <O:\:c:g:>;#;2;O;#>4.>AȨ>h_>o>>>>o>}r>wo>nN>g`>>~U>> >i>8;:j:7u:<;k,;I;v/;Ȑ<<=<>.^>2>>D >>,>M >>{V>X>])>bh>q9>|(>>d0>|>>>'8 ::0:W; U;PE;f;T\->/~>?>TR>>:>>O>>>l@>T>i >[z>]q>}>ő>^}k>L>Q[>h>:o3::Q{;Ye; <<cW>>?>h>>R>S><>?>,>>#>3>́>W> >a >4>y#>l'`>p>Vm>8) :p::;;/<^;2>>}q>>Ş>A>>}>>O>N>>,>>A>ye>>>>]>>> >:׭):;;M!W; <*<\<޵,=Nf2=}=I=\=>FZ>>>`>>k>>#>>>1>>=>V>r>>?.>Ȝ>>5>Bt>~>QN>ɍ:D;!;Z;z<35<4$<=O!_=[k=oa=z=N>y>jF>>Ƥ>ϒ> $>1>*>a>{]>xPq>>q>>>Y>>w>>>>>R>&gdalautotest-3.2.2/gdrivers/data/netcdf/byte_truncated.nc0000664000175000017500000001000014020414072022214 0ustar evenevenHDF  5`OHDR " RV __NCProperties7version=1|netcdflibversion=4.5.0|hdf5libversion=1.8.16 4GDAL_AREA_OR_POINTArea . ConventionsCF-1.5 PGDAL0GDAL 3.1.0dev-70fc3c6-dirty, released 2019/06/07 Yhistory9Thu Jun 13 21:44:47 2019: GDAL CreateCopy( byte.nc, ... )nOHDR   8LOCHKD&transverse_mercatorFf,FSSE_R7OHDR  ?@4 4  G 0CLASSDIMENSION_SCALE "NAMEx/MIOCHKt <vo\OCHK! 4 _Netcdf4Dimid  ?standard_nameprojection_x_coordinate B long_namex coordinate of projection !unitsm|FRHP  (mBTHDd(h evsBTHD  d(h І9FSHDPx(%%CNBXBTLF!6L X KX h20PD\J PVP`A[Y`מ`_B W` 8 ]CúY`X5{HCBTLF CY`P PY`h!6W`PX  _B -SOHDR  ?@4 4  G 0CLASSDIMENSION_SCALE "NAMEyROCHK@yh J)OCHK4 4 _Netcdf4Dimid  ?standard_nameprojection_y_coordinate B long_namey coordinate of projection !unitsm^FHDB8(MV spatial_refpPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT[gdalautotest-3.2.2/gdrivers/data/netcdf/with_bounds.nc0000664000175000017500000000036414020414072021541 0ustar evenevenCDF latnv lat  long_namelatitudeunits degrees_northboundslat_bndslat_bnds|||gdalautotest-3.2.2/gdrivers/data/netcdf/rotated_pole.nc0000664000175000017500000007546414020414072021712 0ustar evenevenCDF xyl  ConventionsCF-1.4 x  long_nameX coordinate of projectionunitsdegrees standard_nameprojection_x_coordinate$y  long_nameY coordinate of projectionunitsdegrees standard_nameprojection_y_coordinate projection grid_north_pole_longitude"grid_north_pole_latitudeBnorth_pole_grid_longitude false_eastingfalse_northingsemi_major_axisJQsemi_minor_axisJ(tg  long_namemean temperatureunitsCelsius standard_nameair_temperature grid_mapping projection _FillValue scale_factor<# s =q zR33p QG=qR33(ڣә{̏\ =ŅzpffH\) QG=qR33(~=qw33p(ib{[ =TLE>H7 0)"R \ ;HƸT\zfhQdzHQ,(\!nၽL>Ǯ?Tz?\??@ @%@A@^@z=q@3/@G@\)@p@Å!@љ@߮@@AA A w!33?E=G? ?}p? =?\1@@0@L(@hQ@=q@Q@fh@z@\@ȣ@ָT@@HAzAA^AAA#A*RA1A8A? AFHAMATA\Ac =Aj{AqAx(A33AAA(AA33ARA=qAAGAAQA A\)AHAffAAp|(V8BNlK$9n0#~B97I-cYy#6d[SJ nnJ\OTtc94Spu= &J2SuA2+eR. *YjB $#3XuxBoM\W +ZgV;BByf?qenR?$ )K".!0uoR"U@P\cmH<!ofqBfn-itJdL"[^{ON`k2fr}EM\ +&Ri%p7(15yY* n,,Rt Z1.|=rG+Ly{^R1j|u%LddDcM/%L_U83i,h?lJ+^d"wZ^jez]LAA,0-J7f7:m0n];gJu</X(sTW>P$#!O" KKe/xyw Zj+,wy{l ]ZHdr}K.Y\GN#A&3ne(Al-lg]^6z)$bW5p6>G'8 Lwz"xRWljvXd(PnmR<Q'ZjCD: <YzIu;\$n$#8Q6 <~+%J4T}JH-^l.'Crl&d(9C )A . 49 ( )s 9o}5>  U2MiiSVDn6~!?>Xh$a` DGO1F}N",l|*B`n+I{7}tXn&>)kf8z~8pyQ#e>BI[ hIHm(7kB00QX')aj !?+\vnx+ra)dyi;H3 RLP^8]8{S@\ 7W!`h J"XIQqX7 " L/+NrL-~dp6p W#QZ"]C Mv9'{)@0Rqn V$=gi`Sz T/ ;XV?oC$8pdA,sJ(8O_|kw&"&+YYnE<":#$aRktqYlL}}~h ,k~=WF,?Tm9AvkFp~'I5!Iz> " /iQ<$Y=;b~7vOn&0ne,.A7'++xepwo`2?[{>K!cYf<*Tf 1G?2S|X[_MRIM?[q'f)4LW" RX6A~a.V}#b[A UI!4|wyax"bCx;rh@*~L N;" '-2J~zzp\l@tLI>f$F]gckiFbK,6)!I<38'?dU{WAg.@z{aC;2-)DPXn>'By#9lwO\( a2h>G" "Sy1Gi;#Eh[z[;$)X~W Ti0/*j(=/ ecJk`r6c#hrM' R|^&s"#;bfK#QpZK" k_o.X2* : C rSiP&K-*eaN<h6'%Fdz5  WS T3_3 olJ$4Cp]YDPxpdbL{!]!(FE6u]~k{RO+ '=m .i`A)ntUSBC mG9!+}-!&8iQbxh/>[I]\M<|`6=OtbB$UdBP<X>@m% 4B="l=v_vxvxk0jaE6-Y1haNMl> (Lm1J5 t6]' i1"y/R#b5hkq&0 G7C.:ak}V]4zK|G BfqzLtqd(X\DL vOrX!gsky~z^l:tahc_0qYqTpX&HEbJqR<|}YXON\8| b?!Q TI*g" |c [Ev]C?I[ptp`N;::A.|*UJCn-%;)1$'?wr8 "'@E:0$$<# r'BFcH}I+\[w5{ " l'NwVDVdcu+Df\e|7X;@fbA [ z,YY1yK @~47XaZ4n*r>05.itwuB!  R+_Ws|5a"c 1LTNbW "@V]Ogq?LQV/Z\6nh!7:dm}s> @Teu!)nKU%ym=-"O %:M_vg:.^~eWm{ QrA6S+7QXq~3JewW%(Nl >?Qpd|s.C(qsBX+904@b?UrP#Jg^x)$:1s$ Sy'Ks Bbz~"wBu `CBy0 b#"%l_7ECsCq%DF.3?HH /k@Gp_1ma4} W.7so8|Dk :_su{y '#t&|G j{G7(Kc#TsC %6!+% y6bR$CO(*B_hF[Tyh`lnwPG-'$P703Q+Rq[R{s$CyG[v~u\l[HJ2+]L<,HDT" 's,;[OasWO,n2|pPH)KB s-WQ=_%Ka ")\g8KOI=r2LK"0yW" h}1 + [a`Kg\zvuDT0V*X"!6Ug%P(MUjr7L=^N22D3'& f`XQc0$nkkB^{P%>tqn`o:Hb0v@[al0d:~bN2fueVLEK3ZNK8*^FWyFu-B%gF',@dd.LUd5(rp`bgkL>DQ{|`:F2Q\[QzN9*6HRHG}(8n|%d=_4 yS&IL }a!z334\t4s#.XiWAIMq;o QtZ?~pK\km]au2nX|MKX TIBl?=w N%c 7v%:TV#Arpe\S6e+TktDG2: V 9:PO=t BS!J;>=L1[z0&"9/ tjB>l a3Aph6dO{)|hv-N?Ay\8jY%bh\u`I'fq]>_7}*\%q D!IUL vgg+U_ w Rv ) }C*knreJils: >NW<59S NbQnnu-R +:wv;64Qmp?! D g 0k0AwR,gdalautotest-3.2.2/gdrivers/data/netcdf/partial_block_ticket5950.nc0000664000175000017500000002515014020414072023710 0ustar evenevenHDF  h*0$OHDR " D ) _nc3_strict  . Conventions COARDS/CF-1.0OHDR  ?@4 4*G +CLASSDIMENSION_SCALE NAMEx@9>OCHK<lOCHK + _Netcdf4Dimid WOHDR  ?@4 4*GB +CLASSDIMENSION_SCALE NAMEy9]AOCHK<yyfhOCHK + _Netcdf4Dimid b)OHDR $   +|0  \DIMENSION_LIST00UFOCHKxzOCHKH l0REFERENCE_LIST6datasetdimension @n OCHK0 l0REFERENCE_LIST6datasetdimension n GCOLyyGGGGGG?@@@@@|@|@A||A|||TREE`pgdalautotest-3.2.2/gdrivers/data/netcdf/int16-nogeo.nc0000664000175000017500000000175414020414072021266 0ustar evenevenCDF xy  ConventionsCF-1.5 Band1  long_nameGDAL Band Number 1 _FillValue skkkkksckk{{k{k{{cs{Jsc{csZcsZcckcck{kkkscscckssZ{skZkskZc{sss{{sck{ccsccs{c{c{{k{ckksskck{{{k{{ssZkkkkkc{s{c{kcs{{k{{{kccs{kksks{{k{{ss{s{{csc{ssk{s{{kssksc{cckc{sc{{ss{ksc{sksss{{{kk{{{s{s{s{ksksss{sks{kssksksk{ssk{{c{ck{skkk{sgdalautotest-3.2.2/gdrivers/data/netcdf/nc_mixed_raster_vector.nc0000664000175000017500000015030014020414072023740 0ustar evenevenHDF  `OHDR @"  I __NCProperties7version=1|netcdflibversion=4.5.0|hdf5libversion=1.8.16 . ConventionsCF-1.6 PGDAL0GDAL 2.4.0dev-29ce66d-dirty, released 2018/11/16 Uhistory5Sat Nov 17 16:00:42 2018: GDAL Create( poly.nc, ... ) ,ogr_layer_namepoly 7ogr_geometry_fieldogc_wkt /ogr_layer_typePOLYGONOHDR !  0CLASSDIMENSION_SCALE3R@OCHK&OCHK `NAME@This is a netCDF dimension but not a netCDF variable. 0 4 _Netcdf4Dimid +\(OHDR ! P 0CLASSDIMENSION_SCALE2OCHK `NAME@This is a netCDF dimension but not a netCDF variable. 1812 4 _Netcdf4Dimid _?OHDR ! @ 0CLASSDIMENSION_SCALE 4Ur OCHK `NAME@This is a netCDF dimension but not a netCDF variable. 16 4 _Netcdf4Dimid X[OHDR <(  A ; long_nameGeometry as ISO WKT `DIMENSION_LIST1"1"h5OHDR ?  ?@4 4G GK 2 long_name Field AREAV  PDIMENSION_LIST1"ܓOCHK ,ogr_field_nameAREA ,ogr_field_typeReal D ogr_field_width  L ogr_field_precision A\WOHDR A  ?@4 4G GT 4 long_name Field EAS_ID PDIMENSION_LIST1"M.OCHK .ogr_field_nameEAS_ID 1ogr_field_type Integer64 D ogr_field_width  z OHDR (  O\ 5 long_name Field PRFEDEA12nFHIBd=9uOCHK /ogr_field_namePRFEDEA .ogr_field_typeString D ogr_field_width 6QOHDR  f dlzQ FSSEB_Q~\vOHDR  ?@4 4  Gf 0CLASSDIMENSION_SCALE "NAMExtZFRHP  7ŐBTHD d( jnuBTHDd( lFSHDPx 5FSSE@FRHP B (w,ڒBTHDd( ?BTHD  d( OFSHDPx(%%@@BTLF!6L X KX h20PD\J PVP`A[Y`מ`_B W` 8 ]CúY`X5YFBTLF CY`P PY`h!6W`PX  _B 0SBTLF~}er!bc?&/@([R$R|^ mv .$KrP3BTLF.$R$v&  (WOCHK6 4 _Netcdf4Dimid  ?standard_nameprojection_x_coordinate B long_namex coordinate of projection !unitsm]kOHDR  ?@4 45 G(g 0CLASSDIMENSION_SCALE "NAMEy 4 _Netcdf4Dimid  ?standard_nameprojection_y_coordinate B long_namey coordinate of projection !unitsm*OHDR (  y5 : long_nameGDAL Band Number 1 A _FillValue 1 LAYER_TYPE athematic ; grid_mappingtransverse_mercator0dGCOL   OCHK `DIMENSION_LIST1"1"JUOCHK tREFERENCE_LISTdatasetdimension JOCHK tREFERENCE_LISTdatasetdimension  ^ kD5OCHK tREFERENCE_LISTdatasetdimension kRHOCHKg `DIMENSION_LIST1" 1" OCHKG tREFERENCE_LISTdatasetdimension   ?OCHKG tREFERENCE_LISTdatasetdimension   FHDB4recordogc_wkt_max_widthPRFEDEA_max_widthogc_wktAREA EAS_ID^ PRFEDEAktransverse_mercatorwx y Band1 FHDBd6 spatial_refqPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]FHDBdegrid_mapping_nametransverse_mercatorlongitude_of_central_meridian ?@4 4@]false_easting ?@4 4Afalse_northing ?@4 4latitude_of_projection_origin ?@4 4!scale_factor_at_central_meridian ?@4 4x#? long_nameCRS definitionlongitude_of_prime_meridian ?@4 4semi_major_axis ?@4 4TXAinverse_flattening ?@4 4Uuor@ GeoTransform440720 60 0 3751320 0 -60 TREE Xilpw~Г TREE TREE TREE  0@P`p AAAAxAhAXAHA8A(AAAAAAAAAAALALALAݜLALALA7LAULAsLALALA͝LALA LA'LAELAcLALALALAskkkkksck΄k{{k{k{{cs{Jsc{csZcsZcckcck{kkkscscckssZ{skZkskZc{sss{{sck{ccsccs{c{c{{k{ckksskck{{{k{{ssZkkkkkc{s{c{kcs{{k{{{kccs{kksks{{k{{ss{s{{csc{ssk{s{{kssksc{cckŭc{sc{{ss{ksc{sksss{{{kk{{{s{s{s{ksksss{sks{kssksksk{ssk{{c{ck{skkk{sPOLYGON ((479819.84375 4765180.5,479690.1875 4765259.5,479647.0 4765369.5,479730.375 4765400.5,480039.03125 4765539.5,480035.34375 4765558.5,480159.78125 4765610.5,480202.28125 4765482.0,480365.0 4765015.5,480389.6875 4764950.0,480133.96875 4764856.5,480080.28125 4764979.5,480082.96875 4765049.5,480088.8125 4765139.5,480059.90625 4765239.5,480019.71875 4765319.5,479980.21875 4765409.5,479909.875 4765370.0,479859.875 4765270.0,479819.84375 4765180.5))POLYGON ((480035.34375 4765558.5,480039.03125 4765539.5,479730.375 4765400.5,479647.0 4765369.5,479690.1875 4765259.5,479819.84375 4765180.5,479779.84375 4765109.5,479681.78125 4764940.0,479468.0 4764942.5,479411.4375 4764940.5,479353.0 4764939.5,479208.65625 4764882.5,479196.8125 4764879.0,479123.28125 4765015.0,479046.53125 4765117.0,479029.71875 4765110.5,479014.9375 4765147.5,479149.9375 4765200.5,479639.625 4765399.5,480035.34375 4765558.5))POLYGON ((479819.84375 4765180.5,479859.875 4765270.0,479909.875 4765370.0,479980.21875 4765409.5,480019.71875 4765319.5,480059.90625 4765239.5,480088.8125 4765139.5,480082.96875 4765049.5,480000.28125 4765043.0,479934.96875 4765020.0,479895.125 4765000.0,479734.375 4764865.0,479680.28125 4764852.0,479644.78125 4764827.5,479637.875 4764803.0,479617.21875 4764760.0,479587.28125 4764718.0,479548.03125 4764693.5,479504.90625 4764609.5,479239.8125 4764505.0,479117.8125 4764847.0,479196.8125 4764879.0,479208.65625 4764882.5,479353.0 4764939.5,479411.4375 4764940.5,479468.0 4764942.5,479681.78125 4764940.0,479779.84375 4765109.5,479819.84375 4765180.5))POLYGON ((479014.9375 4765147.5,479029.71875 4765110.5,479117.8125 4764847.0,479239.8125 4764505.0,479305.875 4764361.0,479256.03125 4764314.5,479220.90625 4764212.5,479114.5 4764174.0,479018.28125 4764418.5,478896.9375 4764371.0,478748.8125 4764308.5,478503.03125 4764218.0,478461.75 4764337.5,478443.9375 4764400.5,478447.8125 4764454.0,478448.6875 4764531.5,478502.1875 4764541.5,478683.0 4764730.5,478621.03125 4764788.5,478597.34375 4764766.5,478532.5 4764695.5,478460.125 4764615.0,478408.0625 4764654.0,478315.53125 4764876.0,478889.25 4765100.0,479014.9375 4765147.5))POLYGON ((479029.71875 4765110.5,479046.53125 4765117.0,479123.28125 4765015.0,479196.8125 4764879.0,479117.8125 4764847.0,479029.71875 4765110.5))POLYGON ((480082.96875 4765049.5,480080.28125 4764979.5,480133.96875 4764856.5,479968.46875 4764788.0,479750.6875 4764702.0,479735.90625 4764752.0,479640.09375 4764721.0,479658.59375 4764670.0,479504.90625 4764609.5,479548.03125 4764693.5,479587.28125 4764718.0,479617.21875 4764760.0,479637.875 4764803.0,479644.78125 4764827.5,479680.28125 4764852.0,479734.375 4764865.0,479895.125 4765000.0,479934.96875 4765020.0,480000.28125 4765043.0,480082.96875 4765049.5))POLYGON ((480389.6875 4764950.0,480537.15625 4765014.0,480567.96875 4764918.0,480605 4764835,480701.0625 4764738.0,480710.25 4764690.5,480588.59375 4764740.5,480540.71875 4764741.0,480515.125 4764695.0,480731.65625 4764561.5,480692.1875 4764453.5,480677.84375 4764439.0,480655.34375 4764397.5,480584.375 4764353.0,480500.40625 4764326.5,480358.53125 4764277.0,480192.3125 4764183.0,480157.125 4764266.5,480234.3125 4764304.0,480289.125 4764348.5,480316 4764395,480343.5625 4764477.0,480343.71875 4764532.5,480258.03125 4764767.0,480177.15625 4764742.0,480093.75 4764703.0,480011.0 4764674.5,479985.0625 4764732.0,479968.46875 4764788.0,480133.96875 4764856.5,480389.6875 4764950.0))POLYGON ((480701.0625 4764738.0,480761.46875 4764778.0,480824.96875 4764820.0,480922.03125 4764850.5,480930.71875 4764852.0,480984.25 4764875.0,481088.1875 4764936.0,481136.84375 4764994.5,481281.3125 4764876.5,481291.09375 4764810.0,481465.90625 4764872.5,481457.375 4764937.0,481509.65625 4764967.0,481538.90625 4764982.5,481575.0 4764999.5,481602.125 4764915.5,481629.84375 4764829.5,481645.3125 4764797.5,481635.96875 4764795.5,481235.3125 4764650.0,481209.8125 4764633.5,481199.21875 4764623.5,481185.5 4764607.0,481159.9375 4764580.0,481140.46875 4764510.5,481141.625 4764480.5,481199.84375 4764180.0,481143.4375 4764010.5,481130.3125 4763979.5,481039.9375 4763889.5,480882.6875 4763670.0,480826.0625 4763650.5,480745.1875 4763628.5,480654.4375 4763627.5,480599.8125 4763660.0,480281.9375 4763576.5,480221.5 4763533.5,480199.6875 4763509.0,480195.09375 4763430.0,480273.6875 4763305.5,480309.6875 4763063.5,480201.84375 4762962.5,479855.3125 4762880.5,479848.53125 4762897.0,479728.875 4763217.5,479492.6875 4763850.0,479550.0625 4763919.5,480120.21875 4764188.5,480192.3125 4764183.0,480358.53125 4764277.0,480500.40625 4764326.5,480584.375 4764353.0,480655.34375 4764397.5,480677.84375 4764439.0,480692.1875 4764453.5,480731.65625 4764561.5,480515.125 4764695.0,480540.71875 4764741.0,480588.59375 4764740.5,480710.25 4764690.5,480701.0625 4764738.0))POLYGON ((479750.6875 4764702.0,479968.46875 4764788.0,479985.0625 4764732.0,480011.0 4764674.5,480093.75 4764703.0,480177.15625 4764742.0,480258.03125 4764767.0,480343.71875 4764532.5,480343.5625 4764477.0,480316 4764395,480289.125 4764348.5,480234.3125 4764304.0,480157.125 4764266.5,480192.3125 4764183.0,480120.21875 4764188.5,479550.0625 4763919.5,479492.6875 4763850.0,479487.75 4763864.5,479442.75 4763990.0,479436 4764023,479398.9375 4764100.0,479349.625 4764230.0,479305.875 4764361.0,479239.8125 4764505.0,479504.90625 4764609.5,479658.59375 4764670.0,479750.6875 4764702.0))POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0)) E A7A`1A|?A7A` A/$@ʡ_@dA`8A7A5" Д@GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGe@`f@`e@e@e@ e@d@c@d@@e@GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG35043411350434233504341435043416350434153504341235043409350433693504340835043413gdalautotest-3.2.2/gdrivers/data/netcdf/trmm-nc4c.nc0000664000175000017500000005611614020414072021026 0ustar evenevenHDF  N\0TOHDR-sNsNsNsN"  }  longitude!latitude?timepcp metimetimetime[KIOHDR-sNsNsNsN(( ?@4 4*G|6 +CLASSDIMENSION_SCALE $NAME longitude 0OCHK[K longitude!(OCHK ,standard_name longitude ( long_name Longitude 'units degrees_east axisXMcPSSSSSSSSxShSXSHS8S(SSSRRRRRRRRxRhRXRHR8R(RRRQQQQQQQQ33`3 322`2 211`1 100`0 0/@/.@.-@-,@,+@+*@*)@)(@('@'&@&%@%$@$OHDR-sNsNsNsN ?@4 4+GW5 +CLASSDIMENSION_SCALE NAMEtime! g}FSSE  OYtimeCOCHK 'standard_nametime :unitshours since 2011-01-01 00:00:00 & calendarstandard{V"OCHK @ _FillValue  ? 8 commentsUnknown1 variable comment & grid_namegrid-1 5level_descriptionEarth surfaceEIFRHP  ([þBTHDd( tBTHD  d( CFSHDPx( %%g'OHDR-sNsNsNsN4(((($ +@7(( : long_nameprecipitation:Precipitation JBOHDR-sNsNsNsN(( ?@4 4*G5 +CLASSDIMENSION_SCALE #NAME latitude ]uFHIB $qOCHK +standard_namelatitude ' long_nameLatitude (units degrees_north axisYpTREE BTLF$ t' ?`?k)07ďa 0oZ'0-!(zz}#KBTLF )?`Z''$!a j&iFHDB 獊 commentsbfile created by grads using lats4d available from http://dao.gsfc.nasa.gov/software/grads/lats4d/CDOHClimate Data Operators version 1.5.2 (http://code.zmaw.de/projects/cdo)FHDB %B _nc3_strict CDIGClimate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi)historyThu Oct 20 17:14:25 2011: cdo -f nc4c copy trmm.nc trmm-nc4c.nc Wed Sep 07 22:33:59 2011: cdo sellonlatbox,-80,-70,-20,-10 tmp4-noc.nc tmp5.nc Wed Sep 7 22:33:53 2011: ncatted -a Conventions,global,d,, tmp4.nc tmp4-noc.nc Wed Aug 24 12:59:04 2011: ncatted -D 10 -a CoreMetadata.0,global,d,, -a ArchiveMetadata.0,global,d,, tmp3.nc tmp4.nc Tue Aug 23 21:04:45 2011: cdo seltimestep,1 tmp2.nc tmp3.nc Tue Aug 23 19:19:18 2011: cdo selvar,pcp tmp1.nc tmp2.nc Tue May 17 19:34:24 2011: cdo sellonlatbox,-85.25,-29.625,15.25,-50 3B43.2011.nc tmp1.nc Tue May 17 19:26:31 2011: cdo mergetime 3B43.110101.6A.nc 3B43.110201.6A.nc 3B43.110301.6A.nc 3B43.110401.6A.nc 3B43.2011.nc ConventionsCF-1.4 calendar standardmodel geos/dascentergsfcOCHK   2time_statisticinstantaneous lDIMENSION_LISTW%W%W%)DGCOL??!`OCHK[ l0REFERENCE_LIST6datasetdimension  JgxOCHK@ l0REFERENCE_LIST6datasetdimension  OCHK?@ l0REFERENCE_LIST6datasetdimension  zaTREENC(( 8;W; 9 D>: D9 : )8 h98 D9]:}: : 9 )8}9 hS9 )9 9 )86i6v8ag:ņ; h9!: ף: ):}: D: D: : ): )8 )8}9 hS9 9 8 )9j : D9}9 )98 D>;9 D9 D9}9X>67a`898 9 )8:|;}9 D9}9 ף:K; H:}9gx; N;gx;9}9h: )89 D>:9 )8 D9 9 D99}9}9 838!884:}9!: D>: )8 )8}: )9yp;W; :;9;;;U; i.;9;8 ]: )8 8 )8 )9 9 hS: h9 : hS99*38\ j8+L9: )8 h9 )8 H: 9 )8;I;_;y;H < 8 898 8 :99 )9Y<:Qr<:ʰ9o99BN@9@9m3: :g: H:: )8j:: )9 D9 8;ī;W;: )8 )8 H:;L; hS: : )9[#:0 E:S :f9@9J9a9^. ; D9 H: 9 )8}9j : ף: h9 3:j : ): : : : : D>:j: 8 8 )8 8}9 95:{d:N\:~5:;::w:l; H: )9 8 hS9}9 )9 9}9!: H: 8 :j ;9 i: ]: {;!: )8 ): D>: )9 )9}9 9j : )9֧ ;:2:G::Ky:<uS<j : h9}9 8 )9 )88 )9 )8 8 8Cc;:1F; )8 9 9;>ܽ;FR;uA;<;ݙ;Ɏ;s|;s;W:;;֡;;>mF:}9 8 )8}9}9: : ; D>: 9 )8 )9 : ]:<;Z8;S;w;`;PG;>;F;mB;;^:g: i:9: ף: i:m; H; :e;m<<~=;@q;4;V;&K>qP>Z>v4>o>*>j+> >j>Gs=eF= ><==y=== hS:j:b;;,;\Ԉ<<<=s\=n¥=U=K#>?p>t>:>Q >;|> P>[^>C>>> =V >M=Y===v= )9 hS9;2<<+<-<<==Z>>'<(>\>wЕ>> >Z>^>(c>V>Y>>L>< >T=q=ب==T= hS: )8 :; 8; )8)7>O&,>qN>a>}>r>r-O>e ;> N>M><)>l4>%>=>">Sު=Ȭ=== 89C9P :t(:;S;},<[W= >d->E>/b>fg>S>@>V`7>6D>A>6,><`,>D>acC>n;#>r">>R>Ae> 8}9 )9 ]; A>a.>-/>(>%>*>0>L8>&>nM&>D*H>0U>k S>$}>f>(>>> )8 ]: )8 )8}9 :S:Cԟ9\:2>:3;Y;6;k}<R<\==Yn===>> '> >$>s!>>S >!>ˆ!>.&>FX>‚>b>i?0?e6?T? 9ɩ;h: ):99T9FoA:}:{0;90;r<|GD={=iX==೮=Yؠ=l=?=a.>]'>by'>9$>>Si>o>>7y@>{>`>V?8C?J2>?^2?b ? )8 : 9{&;8!:h:2S:: :$=;=i <({<\]=*=7T=}u=Um='=r=z=>Mt6>fN>G>>l>21>1>8>J@>T?غ? ??I>> V;U[;: :Ļi:%:퀑:Ġ:#;;GG8>>zU>S>bE>c >=>>mX>>>̮>> I>=^>>Ґ:>GV>UP>Q>:]>߷t>V>7>,>_G3>KX>5y>pe>~m>Q>a4>>>tr]>pn>i>v>9ę>>)]>-ԥ>4>؏>qJ>4I>e>Mcq>Bџ>>>[> :x:uȢ:3:/v:K[:5;+e4;gw;=P#g>oy>>qׇ>zͧ>>:>>k>>s>Y>f7_>W>]K>>%>%> Cc;O<\:c:g:>:#;2;O;;j<,Q.4>A>_h>o>>>>o˘>r}>ow>Nn>`g>>U~>Ӫ> >i>>8ɩ;j:u7:<:,k;I;/v;ȏ;<^.>>2> D>>,> M>>V{>X>)]>hb>9q>(|>>0d>|>>>'̠> 8:0:W:U ;EP;f;\T;&1J<&<<<ݬ~/>ڛ?>RT>>:>>O>>ʏ>@l>T> i>z[>q]>}>Ł>k}^>L>[Q>h>>3o::{Q:eY; ;?>>h>Ψ>R>S><>>ɹ?,>>#>3>̏>W> > a>4>#y>`'l>p>mV>> )8p::ۤ:;/;;^2>q}>>>A>>}>>O>N>>,>ު>A>ey>>>>]>Ӥ>> >>)::;W!M; ;*<\<,<2fN=LJ}=I=\Ь==ZF>ܓ>伻>`>>k>>#>>>1>=>>V>r>>.?>ȣ>Ț>5>tB>~>NQ>>D:!;əZ;z;53<$4<<_!O=k[=ao=z=N=y>Fj>>Ʈ>Ē>$ >1>*>a>]{>qPx>┑>q>>>Y>>w>>>>>R>&>gdalautotest-3.2.2/gdrivers/data/netcdf/test6759.nc0000664000175000017500000000111014020414072020514 0ustar evenevenCDF xy  ConventionsCF-1.5 x  long_namex coordinate of projectionunitsmaxisXy  long_namey coordinate of projectionunitsmaxisY Band1  long_nameGDAL Band Number 1 _FillValue missing_value$$AAAARAR@ARMgdalautotest-3.2.2/gdrivers/data/netcdf/cf_aea2sp_invf.nc0000664000175000017500000000731414020414072022063 0ustar evenevenCDF time1yx ConventionsCF-1.0Originating_center0US National Weather Service (NCEP) subcenter = 5Generating_Process_or_ModelForecastProduct_StatusOperational products Product_TypeForecast products cdm_data_typeGRID creator_name0US National Weather Service (NCEP) subcenter = 5 file_formatGRIB-2historyJTue Oct 25 00:12:56 2011: ncatted -a missing_value,Total_cloud_cover,a,f,nan cf_aea2sp_invf.nc Tue Oct 25 00:12:44 2011: ncatted -a missing_value,Total_cloud_cover,d,, cf_aea2sp_invf.nc Direct read of GRIB-2 into NetCDF-Java 4.0 API; Synthetic dataset from TDS fmrc (best) aggregation, original data from fmrc/NCEP/NDFD/CONUS_5km_CoordinateModelBaseDate2010-01-09T12:00:00ZHistoryTranslated to CF-1.0 Conventions by Netcdf-Java CDM (NetcdfCFWriter) Original Dataset = NDFD-CONUS_5km_best.ncd; Translation Date = Tue Feb 23 14:09:34 MST 2010 Total_cloud_cover long_name%Total_cloud_cover @ entire_atmosphereunitspercent grid_mappingAlbers_Equal_AreaGRIB_param_disciplineMeteorological_productsGRIB_param_categoryCloudGRIB_param_nameTotal_cloud_cover GRIB_param_idGRIB_product_definition_type+Analysis/forecast at horizontal level/layerGRIB_level_typeGRIB_VectorComponentFlag gridRelative coordinates time1 y x missing_valueh time1 units hours since 2010-01-09T12:00:00Z long_nameforecast time coordinate standard_nametime_CoordinateAxisTypeTime y unitskm long_namey coordinate of projection standard_nameprojection_y_coordinate grid_spacing5.07947216796875 km_CoordinateAxisTypeGeoYpx unitskm long_namex coordinate of projection standard_nameprojection_x_coordinate grid_spacing5.07936083984375 km_CoordinateAxisTypeGeoXXpAlbers_Equal_Area grid_mapping_namealbers_conical_equal_areastandard_parallel@=UUUUV@Fꪪlongitude_of_central_meridianXlatitude_of_projection_origin@B false_eastingfalse_northing earth_shape6Earth spherical with radius specified by producer in mspherical_earth_radius_metersAXT@inverse_flattening@rtm_CoordinateTransformType Projection_CoordinateAxisTypes GeoX GeoYBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@V@\8p@fa@@@pIY@zgξ@۪C}@[&@- ",@U@~mId@܋#@o@t@!/a@I*^ g7DohqTw]IṖ 4-C D^{ ] xi4#dgdalautotest-3.2.2/gdrivers/data/netcdf/byte_with_valid_range.nc0000664000175000017500000000027414020414072023545 0ustar evenevenCDF xy Band1  _Unsignedtrue valid_range _FillValue~gdalautotest-3.2.2/gdrivers/data/netcdf/test_ogr_xyz_float.nc0000664000175000017500000000072014020414072023135 0ustar evenevenCDF record lon  standard_name longitude _FillValuelat  standard_namelatitudez  long_name z coordinate standard_nameheightaxisZunitsmint32?@@@?@|||gdalautotest-3.2.2/gdrivers/data/netcdf/cf_geog.nc0000664000175000017500000000423414020414072020605 0ustar evenevenCDF lonlat CDIGClimate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi) ConventionsCF-1.0historyTue Oct 25 00:14:05 2011: ncatted -a missing_value,Total_cloud_cover,a,f,nan cf_geog.nc Tue Oct 25 00:13:55 2011: ncatted -a missing_value,Total_cloud_cover,d,, cf_geog.nc Mon Oct 24 21:59:24 2011: cdo -f nc copy cf_geog.nc cf_geog.nc.okCDOHClimate Data Operators version 1.5.2 (http://code.zmaw.de/projects/cdo) lon  standard_name longitude long_name longitudeunits degrees_eastaxisXpllat  standard_namelatitude long_namelatitudeunits degrees_northaxisYXTotal_cloud_cover long_name%Total_cloud_cover @ entire_atmosphereunitspercentGRIB_param_disciplineMeteorological_productsGRIB_param_categoryCloudGRIB_param_nameTotal_cloud_cover GRIB_param_idGRIB_product_definition_type,Analysis/forecast at horizontal level/layerGRIB_level_typeGRIB_VectorComponentFlag gridRelative missing_valueh4?@@@@@@@ @"@$@&@(@*?@@@@@@@ @"@$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBgdalautotest-3.2.2/gdrivers/data/netcdf/reduce-cgcms.nc0000664000175000017500000006047014020414072021561 0ustar evenevenCDF lon`lat0timebnds titlegCCCma model output prepared for IPCC Fourth Assessment climate of the 20th Century experiment (20C3M) institutionPCCCma (Canadian Centre for Climate Modelling and Analysis, Victoria, BC, Canada)sourceUCGCM3.1 (2004): atmosphere: AGCM3 (GCM13d, T47L31); ocean: CCCMA (OGCM3.1,192x96L29)contact Greg Flato (Greg.Flato@ec.gc.ca) project_idIPCC Fourth Assessmenttable_idTable A1 (17 November 2004) experiment_id/climate of the 20th Century experiment (20C3M) realization cmor_version?u ConventionsCF-1.0historyWed Feb 8 19:23:59 2012: ncra tas_a1_20c3m_1_cgcm3.1_t47_1850_2000.nc reduce-cgcms.nc At 20:27:11 on 02/07/2005, CMOR rewrote data to comply with CF standards and IPCC Fourth Assessment requirementscommentThis integration started at the same point as the preindustrial control run, and spans the period 1850 to 2000. GHG concentrations are prescribed following observations and match the IPCC SRES concentrations at year 1990. The direct aerosol forcing is incorporated via a change in surface albedo which is proportional to the prescribed, time-evolving column burden of sulphate aerosols obtained from O. Boucher, Laboratoire d'Optique Atmospherique, France.nco_openmp_thread_number lon  standard_name longitude long_name longitudeunits degrees_eastaxisXboundslon_bnds lon_bndslat  standard_namelatitude long_namelatitudeunits degrees_northaxisYboundslat_bndslat_bndstime  standard_nametime long_nametimeunitsdays since 1850-1-1axisTcalendar365_daybounds time_bnds time_bnds(height  standard_nameheight long_nameheightunitsmaxisZpositiveuptas  standard_nameair_temperature long_nameSurface Air TemperatureunitsK cell_methods!time: mean (interval: 20 minutes) coordinatesheight original_name ST+273.16historyw At 20:27:11 on 02/07/2005: CMOR altered the data in the following ways: converted from type "double" to type "real";commentTable A1 (17 November 2004) was modified in the following manner; The valid_min parameter for variable tas was changed from 195 to 190H8@@@&@.@2@6@:@@>@@@B@D@F@H`@J@@L @N@O@P@Q@R@S@T@U@V@Wp@X`@YP@Z@@[0@\ @]@^@^@_@`h@`@aX@a@bH@b@c8@c@d(@d@e@e@f@f@f@gp@g@h`@h@iP@i@j@@j@k0@k@l @l@m@m@n@nx@n@oh@o@p,@ph@p@p@q@qX@q@q@r @rH@r@r@r@s8@st@s@s@t(@td@t@t@u@uT@u@u@v@vD??@@@"@"@*@@*@@0@0@4@4@8`@8`@< @< @?@?@A@A@C@C@E@E@Gp@Gp@IP@IP@K0@K0@M@M@N@N@Ph@Ph@QX@QX@RH@RH@S8@S8@T(@T(@U@U@V@V@V@V@W@W@X@X@Y@Y@Z@Z@[@[@\@\@]@]@^x@^x@_h@_h@`,@`,@`@`@a@a@a@a@b @b @b@b@b@b@ct@ct@c@c@dd@dd@d@d@eT@eT@e@e@fD@fD@f@f@g4@g4@g@g@h$@h$@h@h@i@i@i@i@j@j@j|@j|@j@j@kl@kl@k@k@l\@l\@l@l@mL@mL@m@m@n<@n<@n@n@o,@o,@o@o@p@p@pJ@pJ@p@p@p@p@p@p@q:@q:@qv@qv@q@q@q@q@r*@r*@rf@rf@r@r@r@r@s@s@sV@sV@s@s@s@s@t @t @tF@tF@t@t@t@t@t@t@u6@u6@ur@ur@u@u@u@u@v&@v&@vbU.TަSYS~VR$$Q)PsCbLCbYCa7CaOCa-rC`C`FC`6C_C_C_C_jHC_RC_G@C_HEC_V1C_qC_C_C`C`eC`Ca-CaCb!\Cb6Cc;CcCdmCe Ce!CfEwCfjCgqCgICh5ChCicACiCj \CjUCjOCjCjOCjmCj CjiCj-CjJQCj7xCixCiCiUCiCiʄCiCiy8Cij]CiVtCi=Ci1CiUCioCi}CidChCiDCiCi^CiCjArCjtCjcCjCj?CjCjxrCjZgCj0!CiqCiCinhCi!ChChSCgoCgzCg CgCf0Cd%CcBCbtCaMC^C\7CZCYO?CXCYCZ#C[1Ca?Cc[Ce%Cg:Cj=Cl-Cn1Cp\CqCrNKCqGCp$Co&CnMCnQCotCpCp|CqCrWeCrzCsuTCsCt*2CtCu{CuCuCu"Ct%Cr7CqICoCo5Cn}CnmYCnMCowCpQBCqCq_CrGCs):Cs0CsCtoCt&hCt |CsqCsCs Cs7Ct CtsCuCuCt$CsʗCqeCo0Cm=CjUChCCfަCd@cCbCa+FC`0DC_C_zC_C`hC`CaCa'wCaD+Ca{CbCcVCeCeCfCg1CgڼCg5TCeNCbRC_*kC\C\.C]!C^+C^BC^C^jC^1gC^ũC__CaGCc)Ce`NCgؠCjhCmM!CoCqvCs,?Cs%CrCyCxyCxٴCy6gCyCzCz9C{C{wC{6C|Cy2Cx;CxCxCwnCvCv,CvCv[Cv CvaCvuCvvCvi CvICvCuwCuLCuSCuCu?CuhCuCyA CxCyHCyCyCyCz Cz7C{Ci4CjM:CkiCmBCoCqCsCtCt@DCxsCyC{BC|bZC}:_C}C~bC~C4cC1CCX'Cd>CdXCUaC@CcC -CCCChCC5CEC]CCHCCC'CnCCCCݞCCC#CC CKCBCXICxWC-C^CCiCCCLC+\CSCYCFC+CCtCC`C4Cg7CTCOCHjC7CSBCC;C>CC C#^CC CPCCCjC+CC6ClCCCCCC)C7C)C1CmCC_pC݀C"OCJCmC%CCbC1CECCaCCWC*Cl%CCKCqsCCvCqC7CCCCC3CjCuC`]CTCP$CTfCfC|KCCaCCC1C$C0C!C0C*Ca?C:CCCiCCCCCCCCaC3CU$CC:CɣCCܱCCC׃CC7CCCrCLHC!@CICOCCCDClCCCtCzCg,CKZC&CsCFCXSC'C CCoCMCCC%fC@hCbICC|CNCCQCbCCC&CҤCҍCoC`CC3C6CCCiC;CwCC\`C=C/ C$CCCC CICXCnCC9CCC-CpzCCC(C6CCCwCmCeC^C)CCCC.CfCCCiC)JC_CCCUCCCCCCC CZC8C>C*CCCCCCC,C]CCCnCECgC"CvC~C&C0KC4TC4 C.C.NC:ZCPOC_CaoCcCnICwCCCC5CHC$yCCqnC\C]C}CKGC CC@CCC}fC^5CHC:jC9C?CCCC;CCCҚCC5CUC[CQ]CPCUCQCMCJECCC/C |CFFCSClCwCnHClACqCkCd%CdCfCV C4BC$CCACCKCEDC~CCCmCiCCCCC=CM+COCXwCn5CCCC\CC'CRVC5 CCeCCnCCCCCCmCCCC΂CoCCCC[C1CLC9CUC1CCCxCC}CCmCCGaCtCtC2CyC.C$COCCCICqCYzCP*C;CCeCCCtCCCC CC&C9C|CCCkCC6C$CC\ChCIC@CCaCC4C#5C*CC$&C5oCQCfmCcC]Cm3C~C*CCwCfCCCCzC#GC=@C-CUCCrCCSCCFCnCC'CfC8CCCCMCPCCCC|C!CCuC~KC5CrCCpCC C|CC:C?CtCCCC CqCEVC0uC(LCCiCZCԨCݓCC|CCCC CC CCLCzCC C|CC^C*C:C9%COCCC3CC{CCCoCiCdCSCXCg CoCCC5CC CCWC#CICZCYCCCC$CC3C6CCCC}CCޏCC0CC"CaCvCCCCyCC@CCCCCC\C CuC5BCCC[>CBCJ^CcCIC6KCC CCCCxCCaCҗCC>C8C>Cq/CΎC-VCYCPCmCCCMCC$CC}CXC7LC*C CqCZCCPCCCmC_CDtC4CCXCC:CVCC CCCbYC;)CNCPC{CCcCHPCݗCɍC2C~CGC*CGCCCVCCCoCTCHC4CGCCyC\CCC_CCBCCCCCmChBC`CZvCCC.CW%C;$CCC6CΨC2CCOC1CŒCCCCCC@CsC-C:C1 C0TC!C"CCCCXC`CCSC CeCCCCCCCoCtCXCLC0CCzCCqCC8C6CC CC5CC C܆CCC]CͪC)CC|iC7C!DC %CC)C`C}C:CKClUCeBCaCkCCKCAC$CTC&OCC%CSC?`CCCkCM CqsC&CCCCCЈCC=CCC}C!CC2CCxC^CCGCLC>C.C=CFCC|CGCCCQbCOjCC eCgeCCv]CCkCCݳCCTEC@C(C7CCGCäCTCoCCrC2aC0CKCCFCCQChCCCCCH{CCCCcCCHCC}LCeCMC;KC:CFyCrFCC3QCC*C?CCFC2,C]C'CCRC$CғCCCC3CUCCQCʬCLCCCCCBC CCBC,KC.C3C+CCPCCçCCJyC tCCC@CCBC-Cw'C/CCCCiCCZCGCieCeC*ClCCZCp`CICC?CCCCCC*CӬCCNCCC;8CgCCDCCCKCCu;CVCE5CLCVC٪C~CCCsCCz1CCC C_CCRCCCC#CUCCCQCCCiC߯C)C)C=CrCCC+CJCCWoCCyCCCC' C5CM]CZCoCCxC"CUC)CCZC2CjC^CCOCCCdCACC7CC_CgCCC`C2 CCHCifC.CkCCCQCC7CkCG CkgC5C&CCCCgC0zC1CCChTCC $CmCnC9CyC3CCQCC=jCCCWCPCz CzC;CCyCsCwCpCx^C~ CC\CTCCCCC pC+C$CCICXC'CkCCCC-CݑCCC rCC C.HC.WC0C5C19C.,CCSCC|CBCRYCVCdQCaCCCGCIGC|FCFC CVCCCzCHfCVCTC`GCpCgChC[ICRC9C CCCC:CC~Ca(CKC2pCLC C9CCCCCCXCrCCCCCCCCSHC}CsCCgCCCCCCqCfC`CYCCCCC,CMCICC>CCCCC>C@C)CJC_CmCmCC%C7CKkCbCbCjCZCJ=CIQCTUCbC{PC9CCIbC\,CәCCztCN{Cl!CCyCl(CfC^CcCtCcCYCMCyC3UC!CzCCCCNCCCӡCCDCʚC#CCFCCCCeC CKC*C%CC`CKC'CiC>CCPC5C|CC*ClCBCCCXC9CqC.CC\CwCinC.KCCVCYCCC=5CciCC CCg2CACKICCCCaSCnCC~hC{C̿CC>CCCCCCCנCɩCC|C.C|CeCWCAfC/sCCCLCуC|CKC3CrCgC[[C]ClHCPC;C SCaC;CCCvCCC1CCCCXmCPCHC-'CCCICCi7CM0C7CCCCA|CjOCC)CrCC&>CCoCkCCCCCXC$CbCCCCԞCBCC[CjCQCߙCqC8CCCFCCSCC΄CCeCXC4C'CC!CCC|CC|CmXC`(CCC0CCtCgCaCqCCCdCCJC_C:C!C;CCkKCCZCeCC aCC1CCCvCB7C#CCtCC\IC1C`C/CMCwC,C>6CCCXtCC(CfCcCL-CC>C(%CƛCCSJCYC3C CC/C8CzQC|CCCCxCCKCjC C2CseCCTCICCѡCCQCCCzC$C]CCCCwCeCLeC9C"zC CCSCPClHC1CC9CCwClCjcCC MCCTCCTQCrCǷCICC8=C"CCoCC*CCQ[C0CCQCsC| CCCCICmC{CUZC=QC,CCtCyC3C{CCCxCCFCUCoCCC9CgXC&CCWCCYCtC{OC8CbCɵC0?CCݙCVCCCCvC CZCߝCۼCѤC*C"CFCCօCCCCCC}ClC`CRCKC83C !CCCCVECCC C CC~CC9CCtC5;CCCICtC|CUC2CtZC6CICYCCCCC]C~ChCZCPCH(C)RCCCCCCRC$C*CCLCCRC\CqdCCyCCCCCCCCPCC"CKECC CCCYCCC@CE CCɍCCaC C,CCuCC=CMCsCcCUuC?C0CCwCCװCCCCZCzCCaCۼCCCZ$C C% C!OCC9C8C3CC}C?CWCjYCOCCnCCCC CsCC@CTCgCH5C$CqC:CCaC*C3CoCCC8CC1CmCCChCDCCmC?CC^CCCCݴCCChCzCFC$CoC`CvC;C{CnCCYCCCCCzC{CɨC}>CAC6CCC7CvClChCZ1CRCOYCDCJCQCUCi!C{CCFCSCCCZC_CCpC\CCu+C#CgxCCCCCC%CCPCZLCCCCCCCCWC}C9CgC;gCuC3C CyCk1CC.CCʺCCLCCoC@CCCˢCC5CECOC&C.CCCIoCtC``ChCy(C'CRCCCPC&CmC7C&iCCCCCSCBCDCCj`C[C[CwfC3CCGCCJCkCxCCCÇCCJC%CKwCxCCCCoC CãCwCsCCf C5$C^C0C*CYOC1SCtCDCCBC֫CKCCK CiOC@jCSCC6C@CnCnCTC0C }CCCC,kCzC6CsCsZCCJ;CC$CYCEC.^CcTCNCWpCsC-C]C2@C-C%CCeCCrC+1Ci:CsCCw\CnC7CvCZC0kCCCCgCC]Cg&CCC }C= CloCtCCC CB:CbCzCCC,C1CnCrC;CqC9C,oCCHKC1CCCCC/C0CV{CHCCC/-CZCC,5C{CHC%CCCCBC:CC*CCo|CF&C.CC\>CCCCPCUC* CCECCCMCiCC%CCCCC^CLCC3CCCY%CCC@CCC4CCCQC_CPC)CLC@QCKMCZCCC(~CxCCC C,CGCaC^C.CCJCCUCCϒCCj9ChCCCGC"CCC CeCCCPCCpCCpC#C(CʱC4CGCCuCCCECC\CCC{C(C|TCV C(C@CCcCrCCUCC[:CCCCLCqCCRCCC8)C0C?CYCmCChC@CCC<"CCECBCxCs8CFC\CRCCVCmCCCCsC{C@CC/CVOCiCVCCCCCCKCCiC#C|ZCʵCECaC mCTC{CC9CTC-!CCÆC*yCCCeC*MCCu7CCgC%kC CwCRC]PC{QC8CCiC(CCYCӽC]:CACC^CzCmCCڐCC!CoClCؠCC5aCDC CDC΃CCCC?CIC@-C3KCXCCCvCFCjCCnC2kCoZC;CdC4CzC`CCCV3CCC&C7CCVCFC&C C#gCCSCCMCdpCݗCm;C%CACSCCCDCggCbCCCkC=nCC+,CCCC"CC9CeCCCulCRCOC˷CC}1C@GCC>CC!CYC {CRCCR}C,CeC'C^CCCFCCC{CC6CCi)C^CFCCCrCYC&eCECb@CC C/C2CCCCCC3CCkCkCGC^C"C(C!CBCCCCfCCCwCCNCC25C6C>CBCMC0DCRCƑCC*rC\C3CGCCCCjC@C}C CqCCC.XCxCCփCC7CPCWCC4Co6CX:COC:%C#NCCnCCCCCt~CoBCCC)CɜC0'CrCdC~=C}KC}C~C C?C:OCACkC CYCCëCCTC9~CCCWaCCu^CYcCh:C$CCeCqC:CC~wC~qC~qeC~C~@C;zCC*CmDC0C \CxC\HCC/C"CC~C}C+C|C|1C{C{C~2C+3CNC9C/C|1Cx*mCsECpCrBCuiCyC{C6CCoC; C܄CCC CC7=CCCCCC)CC'CCÞCCF~CCMCXICLCYCCCfC .C2C~C~+iC}aC}+C|C|KC}hC}}C|C|jC|C|qC|9FC{KC{#C{C{xWC{jC{iC{ooC{vC{{C{ C{C{C{(C{GC{CwTCw=Cw{CwfCwCw CvCvCvCv$CvʵCwhCw#Cw2CwBCx^UCxCy CysCyCy7jCyYCyoCyiCyCyCyCy߆CyCzCzCz(_Cz6CzBXCzLCzUCz[Cz`XCzbCzcGCzbCzaCz`Cz]Cz[CzVCzQCzIdCz@ Cz6?Cz*CzCz CyCyvCy%CyCyOCyCy`CyGCyrrCyb CyQfCyAxCy3Cy$CyCy CxjCxCx]CxCx CxMCxCxCxCxCxCxCxCxwCxkjCx]CxQmCxFjCx<Cx1Cx)Cx!Cx+CxCxCx CxCxCwCwfCwCxNCxCx CxhCxCx-Cx=CxPCxf4Cx}CxCxCxCxCxCygdalautotest-3.2.2/gdrivers/data/netcdf/cf_lcc2sp.nc0000664000175000017500000000711414020414072021052 0ustar evenevenCDF time1yx ConventionsCF-1.0Originating_center0US National Weather Service (NCEP) subcenter = 5Generating_Process_or_ModelForecastProduct_StatusOperational products Product_TypeForecast products cdm_data_typeGRID creator_name0US National Weather Service (NCEP) subcenter = 5 file_formatGRIB-2history@Tue Oct 25 00:14:54 2011: ncatted -a missing_value,Total_cloud_cover,a,f,nan cf_lcc2sp.nc Tue Oct 25 00:14:41 2011: ncatted -a missing_value,Total_cloud_cover,d,, cf_lcc2sp.nc Direct read of GRIB-2 into NetCDF-Java 4.0 API; Synthetic dataset from TDS fmrc (best) aggregation, original data from fmrc/NCEP/NDFD/CONUS_5km_CoordinateModelBaseDate2010-01-09T12:00:00ZHistoryTranslated to CF-1.0 Conventions by Netcdf-Java CDM (NetcdfCFWriter) Original Dataset = NDFD-CONUS_5km_best.ncd; Translation Date = Tue Feb 23 14:09:34 MST 2010 Total_cloud_cover long_name%Total_cloud_cover @ entire_atmosphereunitspercent grid_mappingLambert_ConformalGRIB_param_disciplineMeteorological_productsGRIB_param_categoryCloudGRIB_param_nameTotal_cloud_cover GRIB_param_idGRIB_product_definition_type+Analysis/forecast at horizontal level/layerGRIB_level_typeGRIB_VectorComponentFlag gridRelative coordinates time1 y x missing_valueh time1 units hours since 2010-01-09T12:00:00Z long_nameforecast time coordinate standard_nametime_CoordinateAxisTypeTime xy unitskm long_namey coordinate of projection standard_nameprojection_y_coordinate grid_spacing5.07947216796875 km_CoordinateAxisTypeGeoYp x unitskm long_namex coordinate of projection standard_nameprojection_x_coordinate grid_spacing5.07936083984375 km_CoordinateAxisTypeGeoXX Lambert_Conformal grid_mapping_namelambert_conformal_conicstandard_parallel@@@Flongitude_of_central_meridian@pplatitude_of_projection_origin@D earth_shape6Earth spherical with radius specified by producer in mspherical_earth_radius_metersAXM_CoordinateTransformType Projection_CoordinateAxisTypes GeoX GeoYHBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@V@\8p@fa@@@pIY@zgξ@۪C}@[&@- ",@U@~mId@܋#@o@t@!/a@I*^ g7DohqTw]IṖ 4-C D^{ ] xi4#dgdalautotest-3.2.2/gdrivers/data/netcdf/geos_rad.nc0000664000175000017500000000251014020414072020772 0ustar evenevenCDF y x  ConventionsCF-1.7 fakedata  coordinatesy x grid_mappinggoes_imager_projection|pgoes_imager_projection long_name GOES-R ABI fixed grid projectiongrid_mapping_name geostationaryperspective_point_heightAi8semi_major_axisAXT@semi_minor_axisAX?ީinverse_flattening@rlatitude_of_projection_originlongitude_of_projection_originV`sweep_angle_axisxy  scale_factor add_offset>unitsradaxisY long_nameGOES Projection y-Coordinate standard_nameprojection_y_coordinate,x  scale_factor9 add_offsetunitsradaxisX long_nameGOES Projection x-Coordinate standard_nameprojection_x_coordinate,BCYCCDD"D=DYDt DBCYCCDD"D=DYDt Dgdalautotest-3.2.2/gdrivers/data/netcdf/fake_Oa01_radiance.nc0000664000175000017500000000127014020414072022525 0ustar evenevenCDF rows columns  Oa01_radiance  coordinates&time_stamp altitude latitude longitude(Oa01_radiance_err  coordinates&time_stamp altitude latitude longitudegdalautotest-3.2.2/gdrivers/data/netcdf/int64dim.nc0000664000175000017500000002014014020414072020644 0ustar evenevenHDF  ` 0Ў8OHDR "  ' ConventionsCF-1.4?YuOHDR  @*/  +CLASSDIMENSION_SCALE NAMEX + _Netcdf4Dimid  !unitsmeters :standard_nameprojection_x_coordinate axisX?OHDR  @* +CLASSDIMENSION_SCALE NAMEY + _Netcdf4Dimid  !unitsmeters :standard_nameprojection_y_coordinate axisY|_OHDR  @*P  +CLASSDIMENSION_SCALE NAMETIME^#zZ]sOCHKj?TIMEOCHK + _Netcdf4Dimid  'standard_nametime axisTIME 9unitsdays since 1970-01-01 00:00:00 1 calendarproleptic_gregorianOHDR 4 * # long_nametestz(OCHKXtest^HOCHK lDIMENSION_LIST000}v ;OCHK l0REFERENCE_LIST6datasetdimension ^XOCHK@  l0REFERENCE_LIST6datasetdimension ^V7TOCHK0  l0REFERENCE_LIST6datasetdimension ^GCOL`gdalautotest-3.2.2/gdrivers/data/netcdf/srid.nc0000664000175000017500000000343014020414072020152 0ustar evenevenCDF yx  ConventionsCF-1.6 y  standard_nameprojection_y_coordinateunitsmetersaxisY valid_rangeYu AYu x  standard_nameprojection_x_coordinateunitsmetersaxisX valid_rangep =qAp =qcrs grid_mapping_namelambert_cylindrical_equal_arealongitude_of_central_meridianstandard_parallel@> false_eastingfalse_northing proj4textW+proj=cea +lat_0=0 +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=msridurn:ogc:def:crs:EPSG::6933crs_wktPROJCRS["WGS 84 / NSIDC EASE-Grid 2.0 Global", BASEGEODCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1.0]]]], CONVERSION["US NSIDC EASE-Grid 2.0 Global", METHOD["Lambert Cylindrical Equal Area",ID["EPSG",9835]], PARAMETER["Latitude of 1st standard parallel",30,ANGLEUNIT["degree",0.01745329252]], PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.01745329252]], PARAMETER["False easting",0,LENGTHUNIT["metre",1.0]], PARAMETER["False northing",0,LENGTHUNIT["metre",1.0]]], CS[cartesian,2], AXIS["easting (X)",east,ORDER[1]], AXIS["northing (Y)",north,ORDER[2]], LENGTHUNIT["metre",1.0], ID["EPSG",6933]] long_name EASE2_T12.5km!scale_factor_at_projection_origin@pP =test  long_nametestunitscount grid_mappingcrs??gdalautotest-3.2.2/gdrivers/data/netcdf/trmm-2x2.nc0000664000175000017500000000376014020414072020607 0ustar evenevenCDF  longitudelatitudetime CDIGClimate Data Interface version 1.5.4 (http://code.zmaw.de/projects/cdi) ConventionsCF-1.4historyWed Oct 24 12:54:08 2012: cdo selindexbox,0,2,0,2 trmm.nc trmm-2x2.nc Wed Sep 07 22:33:59 2011: cdo sellonlatbox,-80,-70,-20,-10 tmp4-noc.nc tmp5.nc Wed Sep 7 22:33:53 2011: ncatted -a Conventions,global,d,, tmp4.nc tmp4-noc.nc Wed Aug 24 12:59:04 2011: ncatted -D 10 -a CoreMetadata.0,global,d,, -a ArchiveMetadata.0,global,d,, tmp3.nc tmp4.nc Tue Aug 23 21:04:45 2011: cdo seltimestep,1 tmp2.nc tmp3.nc Tue Aug 23 19:19:18 2011: cdo selvar,pcp tmp1.nc tmp2.nc Tue May 17 19:34:24 2011: cdo sellonlatbox,-85.25,-29.625,15.25,-50 3B43.2011.nc tmp1.nc Tue May 17 19:26:31 2011: cdo mergetime 3B43.110101.6A.nc 3B43.110201.6A.nc 3B43.110301.6A.nc 3B43.110401.6A.nc 3B43.2011.nccalendar standardcommentsbfile created by grads using lats4d available from http://dao.gsfc.nasa.gov/software/grads/lats4d/model geos/dascentergsfcCDOHClimate Data Operators version 1.5.4 (http://code.zmaw.de/projects/cdo)  longitude  standard_name longitude long_name Longitudeunits degrees_eastaxisXlatitude  standard_namelatitude long_nameLatitudeunits degrees_northaxisYtime  standard_nametimeunitshours since 2011-01-01 00:00:00calendarstandardpcp  long_nameprecipitation:Precipitation _FillValue?commentsUnknown1 variable comment grid_namegrid-1level_descriptionEarth surfacetime_statisticinstantaneousSS33;8 ;W;ňgdalautotest-3.2.2/gdrivers/data/netcdf/scale_offset.nc0000664000175000017500000000475014020414072021654 0ustar evenevenCDF xy  Conventions COARDS/CF-1.0 x  long_namex actual_range$@$y  long_namey actual_range$@$\z  long_namez scale_factor?zG{ add_offset?$" ?@@@@@@@ @"@$$" ?@@@@@@@ @"@$BBBBBpBHB AAA HpŒ ´BBBB|BXB4BAAA4X|¢´BBBB`B@B BAAA @`€ BB|B`BDB(B AAA`@` (D`|ŒBpBXB@B(BAAAA@@@(@XpBHB4B B AAAApA @ p 4HB BBAAAAA@A@@ AAAAAApA@A@@@@@pAAAA`A@A A@@@ @`A AA@@@@@@@?@ @?@@@@@@@AAA `@ @@@AA A@A`AAAp@@@@@AA@ApAAAAA @@AA@AAAABBB H4 p @A ApAAAB B B4BHpX@(@@A@AAABB(B@BXBpŒ|`D( `@A`AAB B(BDB`B|B €`@ AAABB B@B`BBB´¢|X4AAABB4BXB|BBB´ ŒpH A AAB BHBpBBBBgdalautotest-3.2.2/gdrivers/data/netcdf/test_coord_scale_offset.nc0000664000175000017500000000165014020414072024075 0ustar evenevenCDF yx  ConventionsCF-1.6 foo  grid_mappinglambert_projectiony  standard_nameprojection_y_coordinateunitsmeters scale_factor  add_offsetAG3 x  standard_nameprojection_x_coordinateunitsmeters scale_factor@ add_offsetE#mlambert_projection grid_mapping_namelambert_conformal_conicstandard_parallel@9longitude_of_central_meridianWlatitude_of_projection_origin@9 false_eastingfalse_northing semi_majorAXM semi_minorAXMgdalautotest-3.2.2/gdrivers/data/netcdf/bug5291.nc0000664000175000017500000001477114020414072020321 0ustar evenevenHDF  0+ KOHDR " L ) _nc3_strict  ' ConventionsCOARDS 6titleGrid computed inside Mirone 9 descriptionFile written from Matlab E node_offset ?@4 4 +Source_SoftwareMirone^|OHDR hh ?@4 4*Gg +CLASSDIMENSION_SCALE $NAME longitude9 zuOCHK-K longitude(Y=3OCHK + _Netcdf4Dimid  ( long_name longitude 'units degrees_east N actual_range ?@4 40`"c~-4 OHDR 55 ?@4 4*G +CLASSDIMENSION_SCALE #NAME latitudex &@OCHKlC=OCHK + _Netcdf4Dimid  ' long_namelatitude (units degrees_north N actual_range ?@4 4߿~C@(P@D@OͽFRHP  (TBTHDd(  ½BTHD  d( F8}FSHDPx(K%%IBTLF!6L X KX h20PD\J PVP`A[Y`מ`_B W` 8 ]CúY`X5{HCBTLF CY`P PY`h!6W`PX  _B -SOHDR  ?@4 4S  G 0CLASSDIMENSION_SCALE "NAMEyOCHK_ ry 6pOCHK 4 _Netcdf4Dimid  ?standard_nameprojection_y_coordinate B long_namey coordinate of projection !unitsm,COCHK@ J_NCProperties"version=2,netcdf=4.7.0,hdf5=1.8.16ltFHDB>I spatial_refpPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]FHIB vFHDBuȿgrid_mapping_nametransverse_mercatorlongitude_of_central_meridian ?@4 4@]false_easting ?@4 4Afalse_northing ?@4 4latitude_of_projection_origin ?@4 4!scale_factor_at_central_meridian ?@4 4x#? long_nameCRS definitionlongitude_of_prime_meridian ?@4 4semi_major_axis ?@4 4TXAinverse_flattening ?@4 4Uuor@ GeoTransform440720 60 0 3751320 0 -60 AAAAxAhAXAHA8A(AAAAAAAAAAALALALAݜLALALA7LAULAsLALALA͝LALA LA'LAELAcLALALALAx+nɮR'::%[SrqJoxkiiIL(bfTx!@ "#gO W aY0 QzF%bzvt: ,7iz<-xNޚ[Vy[Z!fg̩Ff HJux DQ ͽFRHP  (TBTHDd(  ½BTHD  d( F8}FSHDPx(K%%IBTLF!6L X KX h20PD\J PVP`A[Y`מ`_B W` 8 ]CúY`X5{HCBTLF CY`P PY`h!6W`PX  _B -SOHDR  ?@4 4S  G 0CLASSDIMENSION_SCALE "NAMEyOCHK_ ry 6pOCHK 4 _Netcdf4Dimid  ?standard_nameprojection_y_coordinate B long_namey coordinate of projection !unitsm,COCHK@ J_NCProperties"version=2,netcdf=4.7.0,hdf5=1.8.16ltFHDB>I spatial_refpPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26711"]]FHIB vFHDBuȿgrid_mapping_nametransverse_mercatorlongitude_of_central_meridian ?@4 4@]false_easting ?@4 4Afalse_northing ?@4 4latitude_of_projection_origin ?@4 4!scale_factor_at_central_meridian ?@4 4x#? long_nameCRS definitionlongitude_of_prime_meridian ?@4 4semi_major_axis ?@4 4TXAinverse_flattening ?@4 4Uuor@ GeoTransform440720 60 0 3751320 0 -60 AAAAxAhAXAHA8A(AAAAAAAAAAALALALAݜLALALA7LAULAsLALALA͝LALA LA'LAELAcLALALALAxL06K$DVfUZ<.{y!  4ω%>';Җ%QâK= Z 82xˡ0b 44|j6RSLsL )kVvpis[^QaLz50ix ʡ0 :Bi```W:m{=f;uY-H`pWA:Ӕ"mb 3x!@YD"Hړn!?ϙ\ 6)zR"ʻUP/OHDR (   8shuffledeflate6 SE ᠥOCHKxpBand1KOCHK P _Netcdf4Coordinates  : long_nameGDAL Band Number 1 ; grid_mappingtransverse_mercator `DIMENSION_LIST&&I:OCHKG tREFERENCE_LISTdatasetdimension  OCHKG tREFERENCE_LISTdatasetdimension  GCOL  pTREEVJ 2J GK  gdalautotest-3.2.2/gdrivers/data/netcdf/byte.nc.txt0000664000175000017500000001123314020414072020772 0ustar evenevennetcdf byte { dimensions: x = 20 ; y = 20 ; variables: char transverse_mercator ; transverse_mercator:grid_mapping_name = "transverse_mercator" ; transverse_mercator:longitude_of_central_meridian = -117. ; transverse_mercator:false_easting = 500000. ; transverse_mercator:false_northing = 0. ; transverse_mercator:latitude_of_projection_origin = 0. ; transverse_mercator:scale_factor_at_central_meridian = 0.9996 ; transverse_mercator:long_name = "CRS definition" ; transverse_mercator:longitude_of_prime_meridian = 0. ; transverse_mercator:semi_major_axis = 6378206.4 ; transverse_mercator:inverse_flattening = 294.978698213898 ; transverse_mercator:spatial_ref = "PROJCS[\"NAD27 / UTM zone 11N\",GEOGCS[\"NAD27\",DATUM[\"North_American_Datum_1927\",SPHEROID[\"Clarke 1866\",6378206.4,294.9786982138982,AUTHORITY[\"EPSG\",\"7008\"]],AUTHORITY[\"EPSG\",\"6267\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4267\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"26711\"]]" ; transverse_mercator:GeoTransform = "440720 60 0 3751320 0 -60 " ; double x(x) ; x:standard_name = "projection_x_coordinate" ; x:long_name = "x coordinate of projection" ; x:units = "m" ; double y(y) ; y:standard_name = "projection_y_coordinate" ; y:long_name = "y coordinate of projection" ; y:units = "m" ; byte Band1(y, x) ; Band1:long_name = "GDAL Band Number 1" ; Band1:_Unsigned = "true" ; Band1:valid_range = 0s, 255s ; Band1:_FillValue = 0b ; Band1:grid_mapping = "transverse_mercator" ; // global attributes: :GDAL_AREA_OR_POINT = "Area" ; :Conventions = "CF-1.5" ; :GDAL = "GDAL 2.3.0dev, released 2017/99/99" ; :history = "Thu Apr 27 15:23:11 2017: GDAL CreateCopy( byte.nc, ... )" ; data: transverse_mercator = "" ; x = 440752, 440810, 440870, 440930, 440990, 441050, 441110, 441170, 441230, 441290, 441350, 441410, 441470, 441530, 441590, 441650, 441710, 441770, 441830, 441890 ; y = 3750152, 3750210, 3750270, 3750330, 3750390, 3750450, 3750510, 3750570, 3750630, 3750690, 3750750, 3750810, 3750870, 3750930, 3750990, 3751050, 3751110, 3751170, 3751230, 3751290 ; Band1 = -75, -75, -100, -108, -100, -100, -100, -75, -124, -108, 115, -124, 107, 107, 107, 107, 107, 115, 99, 107, -83, -9, -1, -50, -124, 107, -116, 123, -108, -124, -91, -91, -108, -116, -124, 123, 107, 123, 107, 123, -100, -75, -116, -83, 123, -124, 99, 115, 123, 74, 115, 99, 123, -116, -100, -124, -91, -116, -116, 99, -67, -83, -116, -116, -91, 115, -124, 90, 99, 115, 90, 99, 99, 107, 99, -124, 99, 107, -124, -124, -91, -108, -100, 123, 107, 107, 107, 115, -116, 99, 115, 99, 99, 107, 115, -124, 115, 90, 123, 115, -116, 107, -116, 90, 107, 115, 107, 90, 99, 123, 115, 115, 115, 123, 123, -108, 115, -108, 99, -124, -108, -124, -124, 107, 123, 99, 99, 115, 99, -124, 99, -116, 115, -108, 123, 99, -124, 123, -108, -116, -83, -108, 99, 123, 123, 107, 123, 99, 107, -67, -83, 107, 115, 115, 107, 99, -116, 107, -83, -116, 123, 123, 123, 107, -116, 123, 123, 115, 115, 90, 107, -83, 107, 107, 107, 107, 99, -124, 123, 115, -124, -124, -124, 123, 99, -124, 123, 107, -108, 99, 115, 123, -116, -83, 123, 107, 123, 123, 123, 107, -116, -116, 99, -116, 99, 115, 123, 107, -124, 107, 115, 107, 115, 123, -124, 123, 107, 123, -124, -124, 123, 115, -124, 115, 123, -124, 115, -124, -124, 123, 123, -124, 99, 115, 99, 123, -124, 115, 115, 107, -108, 123, -108, 115, -108, 123, -116, 123, 107, 115, -124, 115, 107, 115, 99, 123, 99, -75, 99, 107, -59, -83, -108, -116, -116, -124, 99, -124, 123, 115, -116, -124, -124, 99, -124, 123, -124, -83, 123, 115, -67, -83, -83, -108, -108, 115, -108, 123, 107, -124, 115, -124, -100, 99, 123, 115, -124, -124, -50, 107, -124, -100, -124, -116, -124, -124, 115, 115, 115, 123, -108, 123, -91, 123, -124, 107, 107, -124, -100, 123, -108, -124, 123, 123, 115, -124, -124, 123, 115, 123, 115, 123, 107, 115, -108, 107, 115, -116, 115, -124, 115, -124, -116, -124, 123, 115, -116, 107, -116, 115, -124, 123, 107, -124, -124, 115, 115, 107, 115, 107, 115, -124, 107, 123, -108, 115, -91, 115, -116, 107, 123, 123, 99, -124, 123, -124, -124, -124, 99, -100, 107, 123, -124, 115, -124, -124, -116, -124, -124, -124, 107, -124, 107, -124, -124, 107, 123, 115, -100, -108 ; } gdalautotest-3.2.2/gdrivers/data/netcdf/cf_no_sphere.nc0000664000175000017500000000704014020414072021644 0ustar evenevenCDF time1yx ConventionsCF-1.0Originating_center0US National Weather Service (NCEP) subcenter = 5Generating_Process_or_ModelForecastProduct_StatusOperational products Product_TypeForecast products cdm_data_typeGRID creator_name0US National Weather Service (NCEP) subcenter = 5 file_formatGRIB-2historyFTue Oct 25 00:15:16 2011: ncatted -a missing_value,Total_cloud_cover,a,f,nan cf_no_sphere.nc Tue Oct 25 00:15:10 2011: ncatted -a missing_value,Total_cloud_cover,d,, cf_no_sphere.nc Direct read of GRIB-2 into NetCDF-Java 4.0 API; Synthetic dataset from TDS fmrc (best) aggregation, original data from fmrc/NCEP/NDFD/CONUS_5km_CoordinateModelBaseDate2010-01-09T12:00:00ZHistoryTranslated to CF-1.0 Conventions by Netcdf-Java CDM (NetcdfCFWriter) Original Dataset = NDFD-CONUS_5km_best.ncd; Translation Date = Tue Feb 23 14:09:34 MST 2010 Total_cloud_cover long_name%Total_cloud_cover @ entire_atmosphereunitspercent grid_mappingLambert_ConformalGRIB_param_disciplineMeteorological_productsGRIB_param_categoryCloudGRIB_param_nameTotal_cloud_cover GRIB_param_idGRIB_product_definition_type+Analysis/forecast at horizontal level/layerGRIB_level_typeGRIB_VectorComponentFlag gridRelative coordinates time1 y x missing_valueh time1 units hours since 2010-01-09T12:00:00Z long_nameforecast time coordinate standard_nametime_CoordinateAxisTypeTime Ly unitskm long_namey coordinate of projection standard_nameprojection_y_coordinate grid_spacing5.07947216796875 km_CoordinateAxisTypeGeoYp Tx unitskm long_namex coordinate of projection standard_nameprojection_x_coordinate grid_spacing5.07936083984375 km_CoordinateAxisTypeGeoXX Lambert_Conformal grid_mapping_namelambert_conformal_conicstandard_parallel@@@Flongitude_of_central_meridian@pplatitude_of_projection_origin@D earth_shape6Earth spherical with radius specified by producer in m_CoordinateTransformType Projection_CoordinateAxisTypes GeoX GeoYBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@V@\8p@fa@@@pIY@zgξ@۪C}@[&@- ",@U@~mId@܋#@o@t@!/a@I*^ g7DohqTw]IṖ 4-C D^{ ] xi4#dgdalautotest-3.2.2/gdrivers/data/netcdf/test_ogr_no_xyz_var.nc0000664000175000017500000000014014020414072023310 0ustar evenevenCDF record int32Xgdalautotest-3.2.2/gdrivers/data/netcdf/melb-small.tif0000664000175000017500000003615114020414072021426 0ustar evenevenII*O*S   ZVx >@>@?AMO#  )#WGS 84 / UTM zone 55N|WGS 84|svq__prllrzyqmXMXr A]jr\e{y=    )kufjrtndXZVnyae{|oktd[wtZHT`]s{wlagd\dfdnqsZGMNbxq[9 0h`F"HcqU  Akhfjmge`[Wo{ilyzsngbgwlYT[bZy~xug\NHMMMZdgaI>ISboqzz~wpL( ++ :`"     ]j\ae_\ZX[v}oowxsmfgif\Zdba\v~~utp[L??JMEL^RBYNE_WRKcugO(  5   NligaX`c]f}oktsojkni\RYgjogm~~wtwhZHJOK?CXUGSRFT__TgsH*     'gdbarnanrhlqmlpxlXZansnjp{|a[WRPQRTNPSGG\idcpf#     `wgjourgmxgotoprvj]inpqflsg_db]__SC==92@LJDB3   Pkjhibaiwvvqplokfpvtojpiu~wkbelmyxk_D(   @lhjhebam|xvspnnljszlmldTfw|o^X`mofly{|VLCE)     "ekkmddlxv~}yzwrsponpx~rogleWpqf\ahsphit}o{t*      1oyvu}xt}yx{xttrvuvyywwum|`ss_bz~}qqtxtsomrWC5   6kpzzzvwvvwtsu{ysvwyxnmkxsr{y{uliihhlqxvR.   4`hkmwpqqqtsstvxsolpsyqjXwz||lpomqrou||p*   $]gaftytqutruurlecegswsokr{jrzzxquusrmu{G  9PBgb]arvvuw|{nnjhefntpddegjlp{yw~}}yutolvqzZ  Tshcj{~^HYlulL`rrsu|rdftH]}wy|vwy|}}qnsusg*   =G^v3 Qvlnv~y1$9C21hwlpt}ysuz\l~pWalkow|}yt~_3 Dsukkq NrgnxH 6hrkkmmelz|z|wxx}e;VhYf7dz}|l+    >g\bjqz  =lmflu~p!  !UiekiVOi{z}uljx~rbf_bwxxxxxxenS  )`bjqmZ 4dwxwurnL .Xnshemfcrosg_WVQbTIX\P_^hhe`WgvuxVkncuze#  !dVpn8 b|b7<<   Btwo`ds{zpvxjmWZkd`gd9Ssvlhlr{zswcqqefk{@  2dRN[mQ  ew{R   1zhppftzyrooznoxptRS{rx|yx}tdfg`[f_gy}9   Tk^\?   RrnZ  Hxlm~fqusjeey||}u{wmq_m|yz|wao|upmgkv7    ,p" *6H0  1@GU? !Zmqzsmntxxotmf\zw~~xqmwoeg}y}{vnvn*   6B8a.        6x~xzxo~f}wTrtzaulcpqlkwqyx{t{B  2s~K     .U^lt}zVrvxcnoou|q}zx}tsc: &p[   %CYh|sxsxvsrpw|soqowkY(  ;v~=    Bcot^Utwtiqyquzuxutsoi?!GUe{{xyI  =h@ 9]qvkU[lsjbpss~}}rjstw];" 8wqxsv|iyr.  dl" &UospaZfnic{Piojywppqpn`R9\DCpaizp~lh     Z@  2?Phg_fkpYnuop}ypkkljbYV\uPvwy}rdssg}o      /Yq-  =rqmozbwqpu~qscWao ">gkmu~wN       Rl^{qh# =dntqpbokp|ooe+!GaI+!/gq}wr}|  )JK$    Hz~u  ,Rcnoitpxljy|}rqf_`k\V/Oavuty}{